v1.54
Aug 2, 2026 – Aug 4, 2026 · 24 changesFeatures
- signage add permission granularity to signage routes (#613)
- signage operator review UI for menu board photo import (#604)
- signage build a dynamic menu board from a photo of a static one (#603)
Fixes
- deploy widen the API health check window (#621)
- ai reconcile model defaults and replace retired OpenAI models (#612)
- models register every model centrally; add a ref invariant test (#618)
- models repoint 44 ref: 'Product' paths at ProductTenantRelationship (#611)
- online-orders getOrder threw MissingSchemaError; tighten the suite (#616)
- tests tenantTax fixtures wrote to the dead Product collection (#617)
- coupons getCouponById threw MissingSchemaError on populate (#614)
- signage 'signage:devices:manage' could never be satisfied (#615)
- reports aggregations joined the empty legacy products collection (#609)
- eliminate the last legacy Product model queries (tranche 3) (#608)
- legacy Product model audit, tranche 2 — chatbot and reports (#607)
- stop reading the dead legacy Product model (tranche 1 of audit) (#606)
- signage read catalog from ProductTenantRelationship, not legacy Product (#602)
- same-instant sales, SSH multiplexing in deploy, idempotent roadmap generator (#600)
Improvements
- upgrade Node 20 -> 24 LTS and stop installing npm@latest (#599)
Other
- seed per-test in the 67 suites where beforeAll fixtures were being wiped (#622)
- tighten tolerant assertions across 35 suites; fix two more 500s (#620)
- booking assert real outcomes in the online booking suite (#619)
- reports data-asserting coverage for the product-join pipelines (#610)
- signage add a signage E2E project (#605)
- record the production SSH connection-rate constraint (#601)
v1.53
Jun 1, 2026 – Aug 2, 2026 · 53 changesFeatures
- community operator discussion forum (global board + moderation) (#597)
- help search article body text, not just title/summary/tags (#593)
- help deep-link to a specific article from contextual help (#590)
- pos-native Report Incident quick-file from the POS register menu (#585)
- shift-reports auto-pull food-prep status into the handoff snapshot (#584)
- staff Staff Portal shift-close page + fix incident page API paths (shift reports PR 3) (#582)
- pos "Close Shift" entry in the web POS register menu (shift reports PR 2) (#581)
- shift-reports end-of-shift closeout + handoff report (cross-vertical) (#580)
- incidents cross-vertical incident report system (#579)
- launch native dock-walk screens for the Launch app (PR 2) (#578)
- marina dock walk inspections — patrol rounds, per-slip issue tracking, work-order escalation (#577)
- web tighten roadmap to ~30 headline features (#572)
- web condense roadmap to major features with plain-English summaries (#571)
- web release notes as a technical changelog by version (#570)
- web condense release notes to major-first (highlights + "Also shipped") (#569)
- online-ordering pay-in-store deposit UI + storefront checkout fixes (#561)
- online-ordering pay-in-store deposits (backend) (#560)
- payments record + alert on Stripe disputes (#557)
- online-ordering order ahead, pay in store (#555)
- native-pos refund-sale action in ReceiptActionsSheet (#554)
- labels server-side multi-brand network label printing (#548)
Fixes
- marina operator paths honor awaiting_documents gate + sync slip denorm (#574)
- marina format status/lease/phone through FormatUtils + PhoneUtils on ops pages (#576)
- marina work-order total recalcs, launch payment idempotency, dry-storage renewal (#573)
- web public release-notes page + repair roadmap rendering (#568)
- marina RLS-scope client/auth-supplied findById in launch + work-order writes (#566)
- marina RLS-scope agreement controller findById + add service unit suite (#565)
- marina round fuel-sale money to cents + make payment recording idempotent (#564)
- marina mooring waitlist/auto-rebook/bulk-reassign hardening + taxonomy cleanup (#563)
- marina validate slip bookings against leases + vessel fit; guard refunds (#562)
- commission calculate commission on created-completed sales (#558)
- refunds direct-key Stripe tenants can refund cards (#556)
- refunds POS card refunds actually reverse the charge in Stripe (#552)
- payments idempotency keys on refunds to stop double-recording (#547)
- ci recycle jest workers via --workerIdleMemoryLimit to stop OOM (#551)
- ci apply 4GB heap to test runs + de-time-bomb marina lease dates (#550)
Other
- slim CLAUDE.md 74% by relocating subsystem detail into docs/ (#598)
- help editorial pass — warmer, clearer, more thorough articles (#596)
- help complete follow-ups — customerPortal Swagger, POS help, nav notation (#595)
- help more marina depth — reservations vs agreements, launch flow, map, self-booking (#594)
- help add Digital Signage category + ingredient-modifier & batch/food-cost depth (#592)
- help document Purchasing/Vendors, Invoices, Register Sessions, customer portal (#591)
- help add What's New, security & inventory best-practices articles (#589)
- help add a self-contained Help page to the Staff Portal (#588)
- help comprehensive knowledge-base buildout + contextual page helpers (#587)
- swagger fill genuine OpenAPI gaps (laborReports, timecards, signage) (#586)
- complete Swagger coverage + surface recent features on roadmap + README (#583)
- marina cover internal bookingController validation + error mapping (#575)
- reflect pay-in-store deposit UI as shipped; bump roadmap lastUpdated (#567)
- payments Square sync intentionally inline; Terminal cascade parity (#559)
- correct parity-backlog premises + add native hardware plan (#553)
- native-vs-web parity backlog (#549)
- Sync Admin roadmap build artifact
v1.52
May 26, 2026 – May 29, 2026 · 53 changesFeatures
- labels tenant-portal Settings tab for network-printing toggle (#546)
- labels per-tenant network-printing toggle (graduates env flag) (#545)
- native-pos Print Label screen — calls /api/labels/print (#544)
- labels Option A foundation — server-side ZPL over TCP (flag-gated) (#543)
- money cent-rounding helpers + apply at top float-drift sites (#541)
- marina nudge operators to canonical Stripe paths in wizard (#522)
- marina collect mailing address in the onboarding customer step (#520)
- e2e marina vertical seed scaffold + 14 marina API smoke tests (#517)
Fixes
- modifiers atomic edit for custom modifier groups (closes data-loss path) (#531)
- marina explicit field selection in Reservation.addPayment (#525)
- customers return 400 (not 500) when Customer is missing both name and company (#523)
- marina persist payment gateway IDs on LaunchRecord card payments (#521)
- pos persist card brand + last4 via canonical cardDetails shape (#519)
- test Jest suite stable under parallel load + 6 stale assertions (#516)
- kds DisplayOrder auto-create on POS sale + cross-surface E2E test (#501)
- Admin Portal tenant populate + dev product seed using canonical service (#496)
Improvements
- transactions add {tenantId, status, createdAt:-1} compound index (#540)
Other
- labels clarify the server-stub + tenant-page printing gap (#542)
- deps mongodb-memory-server 10.4 → 11.2.0 (test infra) (#539)
- deps twilio 5.13 → 6.0.2 (#538)
- deps redis 5.10 → 6.0.0 (#537)
- deps eslint 8 → 9 flat-config migration (#535)
- deps pdf-parse 1.x → 2.4.5 migration (#534)
- deps safe major-version bumps (helmet, rate-limit, dotenv, types) (#533)
- deps bump nodemailer/apn/anthropic-sdk to fix remaining 3 vulns (#532)
- clarify misleading "Hidden for now" comment in square-migration (#530)
- delete deprecated toggle-switch-utility.js (already unused) (#529)
- remove dead tileLinks no-op + 8 stale destructures (#528)
- deps npm audit fix — patches 19 of 23 vulnerabilities (#527)
- remove stale CLAUDE.md notes + rename GlobalCustomer UI stragglers (#526)
- husky surface failing-test detail in pre-push output (#524)
- e2e payments API contract + flag schema gap on card metadata (#518)
- final pass — 159 specs across 8 projects in ~100s (#515)
- e2e rounds 32-34 — auth lifecycle + customer accounts + observability (140->159) (#514)
- e2e rounds 29-31 — Users/Roles + Tax/Features + User Preferences (125->140) (#513)
- e2e rounds 25-28 — business APIs + push + misc (105->125) (#512)
- e2e rounds 20-24 — API surface depth (73->105) (#511)
- thoroughness pass — 73 specs, 4 bugs caught, 19 PRs landed (#510)
- e2e rounds 17-19 — Admin page sweep, Inventory + Customer API (58→73) (#509)
- e2e rounds 13-15 — system health, public booking, marina feature-gate (45→58) (#508)
- e2e rounds 9-12 — receipt flow, tx state machine, storefront (38→45) (#507)
- e2e rounds 7-8 — Customer Portal + Permission matrix (28→38) (#506)
- e2e rounds 4-5 — Staff time-clock + Schedule, KDS item bump + recall (#505)
- e2e rounds 1-3 — POS edge cases, modifiers, Admin users+subs (#504)
- sweep for E2E framework (9 PRs, 17 tests, 3 bugs caught) (#503)
- e2e Staff Portal coverage (5th surface) (#502)
- e2e KDS pairing helper + boot tests (#500)
- e2e Admin Portal — dashboard + tenant list, plus super_admin seed (#499)
- ci workflow housekeeping (does NOT fix the startup_failure issue) (#498)
- e2e POS phase 3 — multi-product + hold/recall + refund (#497)
- e2e POS pairing helper + first end-to-end cash sale (#495)
- e2e Playwright scaffold + isolated test tenant + first passing suite (#494)
- sweep documentation for PRs #463-#492 (#493)
v1.51
May 25, 2026 – May 26, 2026 · 13 changesFeatures
- ai bulk Draft all POs in the Reorder Plan tab (#492)
- native PIN lockout after 5 failed attempts (#491)
- native cash drawer test button + failure surfacing (#490)
- native POS printer failures surface in the sale toast (#489)
- native held-order count badge in POS menu (#488)
- native POS held orders — persistence + recall UI (#487)
- native auto-print receipts toggle in Printer Settings (#486)
- native receipt actions — reprint / email / text (#485)
- native POS checkout a11y — CategoryTabs + SearchBar (#484)
- native POS checkout a11y — ProductTile + Cart + CartItem (#483)
- native post-sale "Sale complete" toast (#482)
- native auto-print receipt + cash-drawer pop after sale (#481)
Other
- native surface Sync Status + Printer Settings in POS menu (#480)
v1.50
May 24, 2026 – May 25, 2026 · 24 changesFeatures
- native clear PIN on app backgrounding (#479)
- native OfflineBanner on Terminal + Launch (#478)
- native accessibility pass on shared components (#477)
- native auto-clear PIN screens after 15s of inactivity (#476)
- native POS sync-status screen + manual retry (#475)
- native root-level ErrorBoundary across all 4 native apps (#473)
- native persistent offline banner on POS (#472)
- ai tool-use evals for the AI platform (#471)
- ai reorder highlights card in Daily Briefing (#470)
- ai draft PurchaseOrders from a reorder plan (#468)
- ai reorder plan UI tile in AI Insights (#467)
- ai vendor-grouped reorder plan endpoint (#466)
- ai POS native streaming dock (react-native-sse + hook) (#465)
- ai SSE streaming endpoint for POS copilot (chat/stream) (#464)
- ai wire Anomalies tab to anomalies-explained endpoint (#462)
- ai sales anomaly explanations endpoint (#460)
- ai Marina Renewal Pipeline UI tile on the Insights page (#459)
- ai marina renewal pipeline with AI-augmented retention outreach (#458)
- ai Cash Flow Forecast UI tile on the Insights page (#457)
- ai AI-augmented cash flow forecast for the Insights dashboard (#456)
- ai AI Customer Insights tile on the Insights page (#455)
Other
- native one-shot prebuild:ios script in every native app (#474)
- ai observability polish + AI_PLATFORM_GUIDE refresh (#469)
- ai developer guide for the AI platform (#461)
v1.49
May 14, 2026 – May 24, 2026 · 78 changesFeatures
- ai per-customer AI insights — predicted LTV, churn risk, suggested outreach (#454)
- ai web chat dock consumes /api/ai/chat/stream (#453)
- ai gateway runStream() + POST /api/ai/chat/stream SSE endpoint (#452)
- ai process_refund — highest-blast-radius mutating tool (#451)
- ai tenant-scoped AI spend dashboard widget (#450)
- ai remove_customer_tag + update_customer_email mutating tools (#449)
- ai self-mounting copilot dock for Staff portal (#448)
- ai add_customer_tag — second mutating tool in the proposal flow (#447)
- ai native chat dock renders pending-action cards (#445)
- ai chat enableActions opt-in surfaces mutating-tool proposals (#443)
- ai copilot confirm/decline endpoints + first mutating tool (#442)
- ai OpenAI function-call tool support in the agent loop (#441)
- ai mutating-tool proposal mode + PendingAIAction model (#440)
- ai check_variant_inventory tool — per-variant + per-location stock (#439)
- ai four more read-only tools — products, recent txns, low-stock, top customers (#438)
- ai wire read-only tools into Business Assistant askQuestion (#437)
- ai wire read-only tools into the in-app help bot (chatSupport) (#436)
- ai three real read-only tools — lookup_customer, get_sales_summary, check_inventory_for_product (#435)
- ai gateway tool-calling agent loop (#434)
- ai tool registry foundation — defineTool + per-user resolution (#433)
- ai case CRUD endpoints for the eval harness (#432)
- ai HTTP routes for the eval harness (#431)
- ai eval harness foundation — AIEval + AIEvalRun + 4 scorers (#430)
- ai operator copilot phase C.2 — POS native dock (#429)
- ai operator copilot phase C.1 — POS device-auth chat endpoint (#428)
- ai operator copilot phase B — cache the in-app help bot (#427)
- ai operator copilot phase A — cache the business-assistant Q&A system block (#426)
- ai Anthropic prompt cache support — system + cacheSystem options (#424)
- ai expose per-persona usage + recent errors via metrics API (#422)
- ai per-tenant monthly budget caps (governor + admin API) (#421)
- ai route 6 services through gateway for cost visibility (#420)
- ai platform foundation — model gateway + cost observability (#419)
- launch PIN-only keypad login (no employee picker) (#416)
- marina view mooring map + slip info in the Launch native app (#415)
- launch-app gate behind marina vertical + PIN session + per-action permissions (#412)
- marina live-drag + arrow-key fine-tune in satellite editor (#410)
- marina overlay mooring markers on satellite image editor (#408)
- launch custom app icon — motorboat over waves on TendPOS purple (#407)
- marina add search to moorings page (#405)
- launch active-mooring prompt + cascade respecting agreement gates (#404)
- launch scan AIS sticker barcode from native + web launch wizards (#402)
- launch-native home dashboard, haul-out, typecheck-clean (#395)
- launch-native Tap-to-Pay integration on the native launch app (#394)
- marina-launch vessel-propulsion gating on stickers / fees / packages (#393)
- launch-native new TendPOS Launch iPad app + docs sweep (#392)
- marina-launch operator-defined custom launch fields (#391)
- marina-launch already-paid bypass + AIS sticker number capture (#389)
- customer support company name as alternative to first/last name (#384)
- marina-onboarding-queue per-row Resend Invite button (#382)
- marina-onboarding-queue split Completed into Completed + Awaiting Customer (#377)
- marina-onboarding-queue add search + derive Completed badge from actual customer state (#374)
Fixes
- launch stop PIN screen remount-loop on app launch (#418)
- auth owners-via-roleId short-circuit hasPermission (#417)
- marina match editor container aspect to image so preview = applied (#414)
- marina match map container aspect to background image (#413)
- native wire SafeAreaProvider in POS, KDS, Terminal via shared AppSafeAreaShell (#411)
- launch respect Dynamic Island / notch / home indicator safe areas (#409)
- launch handle Already Paid sentinel in submitLaunch payload (#403)
- marina+payments enforce configured requirements server-side (#397)
- marina-agreements gate active transition on required docs (#396)
- marina-launch auto-populate customer in step 2 when vessel has owner (#387)
- marina-vessels surface pending-agreement vessels in launch search (#386)
- marina-vessels search by registration number across all owners (#385)
- customers re-attach search + page listeners on every onMount (#383)
- marina-sign accept null for optional fields (draw signatures + denied geolocation) (#380)
- marina-onboarding-queue drop Awaiting Customer tab — In Progress is the bucket for everything not done (#379)
- marina-onboarding-queue bucket by agreement state, not wizard step (#378)
- marina-moorings self-healing status resolver + drop Rate column (#376)
- email reply-to now cascades through location → tenant config → tenant.contact (#375)
Improvements
- ai route customer chatbot through gateway, drop duplicate logging (#425)
- marina move marina settings into Marina sidebar group (#390)
Other
- ai seed copilot regression eval cases + idempotent seeder script (#446)
- launch sweep for active-mooring prompt + barcode scanning + home-fix (#406)
- audit round 3: fix 3 real bugs + ratchet coverage + onclick purge + a11y (#401)
- comprehensive codebase audit + safe fixes (#399)
- docs+chore: finalize native launch app + sweep docs for enforcement work (#398)
- vessel search, customer company-name, launch wizard auto-attach (#388)
- onboarding queue buckets + sign nullable validators + reply-to cascade (#381)
v1.48
May 12, 2026 – May 13, 2026 · 9 changesFeatures
- server-tz centralized timezone-aware date formatter + 14-file refactor (#367)
Fixes
- marina-agreement cancelled + expired agreements deactivate the public link (#373)
- marina-moorings pending launches don't promote slip to occupied + rename "Paid" label to "Reserved" (#371)
- migration use actual 'marina_moorings' collection name (#370)
- models partial unique indexes so soft-deleted rows release their slot (#369)
- core import form-tracking so its window globals register (#368)
- marina-pdf always render signed-at timestamp with tz label (#366)
- deploy final nginx reload after health check passes (#365)
Other
- mooring state resolver sweep + cancelled-link + partial indexes (#372)
v1.47
May 11, 2026 – May 12, 2026 · 17 changesFeatures
- marina-onboarding cleanup TBD vessel stubs + clearer chooser (#355)
- marina-onboarding full signed-contract PDF + paid receipt attachment (#357)
- marina-onboarding email signed agreement PDF on activation (#354)
- marina-onboarding customer signature email + manual resend (#351)
- marina-onboarding add "Other" payment method (#348)
Fixes
- marina+portal TBD vessel cleanup + upload indicator + receipt PDF auth (#363)
- marina race condition in customer doc upload finalizer (#362)
- customer-portal PDF download navigates away + lease dates off-by-one (#360)
- marina-agreement gate portal handoff on docs + slip + signed-at TZ (#361)
- marina-onboarding confirmation email + PDF + branding regressions (#359)
- marina-onboarding polish customer email + portal stepper (#356)
- marina-agreement enforce ALL steps before completion, regardless of payment method (#358)
- marina-moorings surface real error when "edit mooring" fails (#353)
- marina make marina-channel Transactions actually persist (#350)
- marina-onboarding use valid launchType enum value (#349)
- deploy sweep stale hash-prefixed containers before docker compose up (#347)
Other
- marina onboarding cascade + customer-portal PDF audit (#364)
v1.45
May 4, 2026 – May 11, 2026 · 42 changesFeatures
- marina-onboarding add "Paid in full" agreement type (#345)
- marina-onboarding record previously-received payments (#344)
- marina-agreement require contract scroll-through before enabling signing (#341)
- marina-onboarding render selected contract template on customer-facing agreement (#336)
- web-pos wire customer-interaction tip prompt into house-account flow
- customer-interaction tip-before-auth + receipt-after for house account
- house-account pinOnTablet uses the reader when one is paired
- native-pos version chip in the header
- customer-modal UI for the house-account PIN
Fixes
- husky cap jest workers at 50% in pre-push hook (#343)
- marina-agreement scroll gate stops false-unlocking when panel is hidden + docs (#342)
- marina-agreement use viewer browser timezone for signed date rendering (#340)
- marina-agreement TZ-aware date / rich-text rendering / signature default + compliance signing-record endpoint (#339)
- marina-onboarding prefill in-flight session view from saved data (#338)
- marina-agreement substitute every {{key}} placeholder, not just declared mergeFields (#337)
- transactions windowed pagination so 3500+ pages do not blow up the layout (#335)
- transactions re-resolve DOM refs each call (router caches module across visits) (#334)
- transactions wire tenant Sales transaction list correctly (#333)
- reader-inputs use Stripe Selection.Choice {id, text} not {value}
- customer-interaction cap reader tip choices at 4; pre-resolve surface mode
- transactions use 'flat_rate' for tenant-fallback tax calculatedBy
- native-pos pass location to /api/transactions on house-account charge
- terminal pass options as 3rd arg to readers.retrieve
- house-account poll reader on /status for reader-driven pinOnTablet
- house-account tolerate value/.foo.value shape variance + log
- terminal drop skip_button on required collect_inputs
- customers server-side houseAccountEnabled filter
- customer-modal delegate Cancel + X close handlers
- customer-modal two house-account save bugs
- customers house-account list filter + diagnostic logging
- modals ModalSystem now sits above other modals + house-account list pagination
- native-pos show house-account auth errors instead of silently bouncing
- customer-modal wire toggles + form submit so they work everywhere
- customers cap limit at 100 to match validator
- marina in-memory search now sees the full dataset
- customers switch search to server-side so it sees all customers
- search wire 2 more orphaned search inputs
- customers wire the search input to filter the table
- ui replace broken modal checkboxes with peer-toggle switches
Other
- align tax assertions with schema enum + use proper tax shape
- sync resolved Admin symlink for modal-system.js z-index bump
- native-pos bump CustomerPicker limits + version 1.0.14
v1.44
May 4, 2026 · 11 changesFeatures
- native-pos customer picker — add/clear customer on cart
- house-account admin settings UI for the auth methods
- house-account native POS auth dispatcher + 4 method UIs
- house-account customer-facing magic-link landing page
- house-account web POS auth dispatcher + 4 method UIs
- house-account customer-authorization framework — backend
Fixes
- customers drop duplicate escapeHtml declaration
- settings drop duplicate escapeHtml redeclaration
- terminal clearReaderDisplay was calling a non-existent SDK method
- terminal reset SmartReader display when cart is emptied
- terminal cancel stuck reader on payment-intent poll timeout
v1.43
May 3, 2026 – May 4, 2026 · 18 changesFeatures
- terminal live cart display on Stripe SmartReaders
- customer-portal dynamic tenant branding — logo / theme color / app title / favicon (#329)
- customer-portal kill cards-on-cards, every tile is now key-value rows on a clean surface (#324)
- customer-portal standardize every dashboard tile to the same vocabulary (#323)
- customer-portal designer fresh-eyes pass — 5 tweaks (#322)
- customer-portal apply design system to remaining 6 module tiles (#321)
- customer-portal premium-friendly mobile-first design system (#320)
- customer-portal move Profile from dashboard card to header avatar menu (#318)
Fixes
- native-pos normalize product._id from server id field
- native-pos parity with web POS + registration loop fix
- customer-portal hero greeting falls back to per-tenant Customer firstName (#330)
- customer-portal remove the card-form Stripe disclaimer copy (#328)
- customer-payment use Map.set/.get for Customer.stripeCustomerIds (#327)
- customer-portal customerPaymentService → stripeClientFactory for Connect support (#326)
- customer-portal replace inline event handlers with CSS hover classes (#325)
- customer-portal remove duplicate page titles in account module (#319)
Other
- customer-portal add future-roadmap planning doc (#332)
- customer-portal close audit gaps from session sweep + add dynamic-branding tests (#331)
v1.42
Apr 27, 2026 – May 3, 2026 · 44 changesFeatures
- customer-portal full self-service surface — profile, addresses, saved cards, vessel CRUD, appointment & maintenance management, receipt PDFs, house-account self-pay (#315)
- customer-portal resolve Location.slug as portal URL — multi-location tenants get per-sub-location branded portals (#313)
- customer-portal auto-surface portal URL on receipts, customer-mode emails, and the storefront (#312)
- customer-portal phase 6 — PDF download + admin operator UI (project complete)
- customer-portal phase 5 — customer-write operations + operator view
- customer-portal phase 4 — retail + property + automotive + self-register
- customer-portal phase 3 — salon, restaurant family, fitness
- customer-portal phase 2 — full marina sub-pages
- customer-portal finish phase 1 — set-password UX + handoff regression tests
- customer-portal cross-tenant /myaccount portal phase 1
- marina customer agreement portal collects + persists supporting documents (#305)
- lan polish — admin observability + feature gating + UX copy (#295)
- lan seamless mode — auto-elect + every-POS relay + sub-1s failover (#294)
- subscription canonical subscriptionService + state machine doc (#291)
- payment wave 3 — House Account refund path (#290)
- payment wave 2 — Stripe webhook + Square + Terminal idempotency (#292)
- payment wave 1 followups — booking refund cascade + idempotency keys (#288)
Fixes
- customer-portal dashboard tile clicks now navigate correctly (#317)
- customer-portal suppress browser-console 403 noise from house-account dashboard probe (#316)
- customer-portal serve slugless /myaccount* routes so magic-link emails minted without a tenant pin land somewhere usable (#314)
- customer-portal branded failure screens for missing/unreachable tenant (#311)
- payments wire loyaltyService.awardPointsForTransaction into recordPayment cascade (#309)
- loyalty decouple loyaltyService from dead CustomerTenantRelationship + delete the model
- customer-portal phase 7 — hardening + dead-code cleanup
- marina-agreement document upload now visibly flips the card to a completed state
- marina-agreement use valid storage scope for customer document uploads
- marina-agreement preserve card data when toggling "save card"
- marina drive customer doc requirements from the per-session wizard step (#307)
- marina wire requireRegistration / requireInsurance toggles into wizard settings (#306)
- marina stop opting out of Stripe address + show signedByName/signedAt on agreement page (#304)
- marina pass address.country to Stripe confirmPayment (#303)
- marina pass every opted-out billing-details field on Stripe confirmPayment (#302)
- marina customer-page Stripe payment + error visibility (#301)
- marina bundle invoice payment options save into Continue (#300)
- marina redirect invoice flow to onboarding queue instead of stranding on payment step (#299)
- marina keep 'invoice' on the staff payment dropdown + auto-select it for invoice-based agreements (#298)
- marina make canonical state machine the single source of truth for mooring occupancy (#297)
Other
- close 4 trailing docs gaps from customer portal + CORS + loyalty cascade work (#310)
- Permissive CORS for /api/public/* + phase 8 test gap-fixes (#308)
- clean up tests broken by the dead-code deletions in 69d5f8fc
- docs+tests: customer portal phase 1 catch-up
- deploy bump SW cache versions for v1.42.18 + atomize bump
- deploy tie service-worker CACHE_VERSION to package version
- admin wire LAN Coordinators dashboard into super-admin sidebar (#296)
v1.40
Apr 26, 2026 · 2 changesFeatures
- marina canonical rentalAgreementService + three-way cascade (#286)
Other
- invoice swagger annotations + state-machine references (#285)
v1.39
Apr 18, 2026 – Apr 26, 2026 · 90 changesFeatures
- invoice canonical invoiceService + cross-domain payment cascade (#284)
- marina mooring state machine follow-ups (lease expiry + UI labels) (#282)
- marina mooring status as single source of truth state machine (#281)
- marina tenant-facing Agreements page + cancel-session cascade (#280)
- vessel-reg pill polish (no grey dot, narrow input) + length dropdown (#279)
- vessel-reg auto-accept on row tap + strict 6-char body input (#278)
- vessel-reg pill + modal picker UI with last-used + recent states (#277)
- marina canonical vessel registration number format (XX NNNN LL) (#275)
- marina wizard back-navigation for editing completed steps (#274)
- marina vessel chooser + deferred customer-profile persistence (#273)
- marina configurable portal + invoice email order per location
- locations picker always visible in every vertical-scoped admin form (#267)
- locations LocationPickerUtil + generic vertical-locationless backfill (#266)
- locations multi-vertical resolver + restaurant/salon-client vertical enforcement (#265)
- locations vertical validation for automotive + fitness + wizard location picker (#264)
- marina+salon admin mooring form location picker + salon vertical validation (#263)
- locations vertical-scoped location resolver + apply to marina controllers (#262)
- marina saved payment methods + hidden billing + per-location toggle (#256)
- marina ACH / bank transfer support in customer portal (#251)
- marina tenant-level inline flat/percentage fees in wizard Settings modal (#247)
- marina split service fees into Merchant Fee Income + fee report UI (#246)
- marina split Fleet vs Customer vessels with ownerType
- ui add UIStates helper for consistent loading/empty/error states
- terminal register Stripe SmartReaders (WisePOS E / S700 / BBPOS)
- payments refund-application-fee policy (global + per-tenant)
- marina show vessel + customer contact on booking detail modal
- marina calendar Start opens existing launch wizard + records payment (#209)
- marina show total / deposit paid / amount due on booking modal (#206)
- email mobile-first responsive styling for every outgoing email (#204)
- marina refund action on calendar + refund prompt on cancel (#203)
- marina click calendar event to open booking detail + actions modal (#202)
- marina unify Calendar / Launch Queue / Reservations into Bookings (#200)
- marina booking management — reschedule, refund, resend-email, launch queue (#198)
Fixes
- deploy add ssh -n in migrations loop so subsequent migrations run (#276)
- locations picker only renders when tenant has ≥2 vertical-matched locations (#268)
- marina scope location fallback + backfill to marina-vertical locations only (#261)
- marina persist mooring locationId, backfill legacy moorings, portal fallback (#260)
- locations+marina persist nested settings + suppress Stripe Link save (#258)
- marina save-method checkbox visibility + suppress Link save text (#257)
- marina suppress Stripe Link / wallet "Add payment method" box in portal (#255)
- marina scope PaymentIntent to the selected method only (#254)
- marina lazy-mount Payment Element per-method + PWA meta (#253)
- marina swap bare ACH input for Stripe Payment Element (#252)
- marina wire real Stripe payment-intent + publishable key for portal (#250)
- marina unclickable payment cards in customer portal + location branding (#249)
- marina multi-token customer search + hide add-customer form until needed (#248)
- ui page-header action buttons use bg-white + text-purple-600
- terminal-reconcile split actionable vs abandoned PIs so alerts stay signal
- stripe-terminal close three go-live checklist gaps
- pos show terminal selector in header even when none is assigned
- terminal deleting a device also unregisters the Stripe reader
- pos drive Stripe SmartReader checkout through readers.processPaymentIntent
- terminal Add Device opens duplicate modals after refresh
- sw handle navigation fetch failures without breaking the page
- payments Connect destination-charge refunds need reverse_transfer
- marina refund fails with 400 because paymentIntentId is dropped on save
- tenant-resolve extend Location.slug fallback to chat + online booking
- customer-auth login / session work on location-slug URLs
- marina public booking URL resolves by location slug, not just tenant (#213)
- marina launch wizard opens on Step 1 with booking vessel prefilled (#212)
- marina prevent duplicate public booking on Pay Now click (#211)
- marina persist fees + paymentIntent on booking doc so the tenant UI can show them (#208)
- marina Start/Complete calendar actions hit StorageRetrieval, not LaunchRecord (#207)
- marina day and month views now show UTC-anchored bookings (#205)
- marina calendar shows actual customer, vessel, and correct time (#201)
- graceful degradation during DB outages (liveness, cache-aside, 503) (#199)
- marina silent session probe + email formatting + location branding (#197)
Improvements
- ui route capitalize+replace hacks through FormatUtils
- ui mobile-responsive round 3 — remaining search filters
- ui UIStates adoption wave 3 — 15 more sites
- ui activate sortable headers on 6 modal tables
- ui mobile-responsive round 2 — grids, touch targets, panel
- ui expand UIStates adoption — 15 more sites
- ui fix mobile-responsiveness gaps in tenant portal
- ui activate sortable headers on 36 list-view tables
- ui unify design system across all apps
- stripe single client factory; pin apiVersion platform-wide
Other
- marina delete legacy mock-call tests skipped in PR #281 (#283)
- document marina portal + email order config + add tests
- CLAUDE.md locationResolver section + roadmap bump to 4.39 (#269)
- marina add diagnostics to saved-payment-methods flow (#259)
- deploy auto-run migrations from src/migrations/auto/*.js
- terminal document checklist fixes per CLAUDE.md mandates
- ui PWA cache + CLAUDE.md + UIStates tests
- sync API docs, roadmap, and help articles with session shipments
- upgrade Stripe SDK v14 to v22
- bump external API versions (Shopify, Square, UPS)
- bump Anthropic, OpenAI, Resend, Twilio, Square SDKs to current
- online-booking update resolveTenant test for Location.slug fallback
- sync API, CLAUDE.md, roadmap, help, tests with post-v4.30 features (#210)
v1.37
Apr 11, 2026 · 5 changesFeatures
- marina multi-step customer onboarding portal
- contracts rich template preview with sample data + clause accordion
Fixes
- marina use UTC timezone for date display to prevent off-by-one
- contracts pass method as fetch options object, not string
- contracts preview template uses POST not GET
v1.36
Apr 10, 2026 – Apr 11, 2026 · 43 changesFeatures
- marina orphaned mooring cleanup endpoint + queue button
- marina table-based invoice email with Pay Now button + proper spacing
- marina contextual onboarding invoice email + due date picker
- marina launch step shows completion screen with skip/launch options
- marina show invoice confirmation + reset after future pay selection
- marina add cancelled filter tab to onboarding queue
- marina cancel/void sessions from the onboarding queue
- marina auto-create + email invoice when payment method is 'invoice'
- marina onboarding queue page for monitoring payment + session status
- marina variant dropdown in line item row instead of picker expand
- marina show product variations in catalog item picker
- marina contract step with line items from catalog, service fees, and custom entries
- marina contract step with template picker + merge fields
- marina documents step with per-type requirement toggles + inline upload
- marina documents step with inline upload + existing docs display
- marina vessel step with customer vessels, search, create, and defer
- marina visual slip picker with dock tabs and color-coded cards
- marina customer search + select in onboarding wizard
- marina remaining marina sprint — occupancy forecast, pricing loop, conflict detector, audit log, bulk reassign, map heatmap, notification automation, integration tests, docs rollup (#192)
- marina admin bulk onboarding import page (#185)
- marina bulk slip reassignment tool for closures and maintenance (#175)
- marina POS terminal touch-friendly mooring onboarding wizard (#186)
- marina Smart waitlist matching engine for mooring assignments (#167)
- marina auto-rebooking engine for freed moorings (#170)
- marina admin onboarding wizard UI (8-step stepper) (#184)
- marina REST endpoints for the onboarding wizard + bulk import (#183)
- marina marinaBulkOnboardingService (CSV preview + apply) (#182)
- marina vessel document upload with pluggable storage backend (#181)
- marina mooringOnboardingService orchestrator (8-step guided wizard) (#180)
- marina MooringOnboardingSession model + per-tenant onboarding policy (#179)
- marina churn risk scoring service for rental agreements (#172)
- marina Dynamic pricing recommendation engine for mooring rates (#168)
- marina Boat-fit validation + tenant isolation tests for mooring module (#166)
Fixes
- marina read token from query param (?token=) in addition to URL path
- marina ensure cancel releases mooring with valid performedBy + reason
- marina public access token does not expire until invoice is paid
- marina generatePublicToken returns a string, not an object
- marina replace inline onclick with addEventListener for CSP compliance
- marina use sessionStorage for queue→wizard navigation
- marina use array index instead of _id for catalog item lookup
- marina handle contract-templates API response shape (data not templates)
- marina auto-resolve locationId when starting onboarding wizard (#194)
Other
- marina add missing onboarding wizard documentation (#193)
v1.35
Apr 9, 2026 · 3 changesOther
- tax loosen taxJar latency assertion to absorb 1ms timer skew (#191)
- marina switch route-count assertions to "at least N" instead of exact (#190)
- lint clean up 96 pre-existing lint errors blocking CI (#189)
v1.30
Apr 5, 2026 · 2 changesFeatures
- Star/Epson SDK transports + Printer Settings UI screen
Other
- Native printing — API docs v1.6, roadmap v4.20 (95 features), +134 tests
v1.29
Apr 5, 2026 · 1 changeFeatures
- Native printing system — Bluetooth, Network, AirPrint transports
v1.28
Apr 5, 2026 · 1 changeFeatures
- Direct ESC/POS receipt printing via QZ Tray, no browser dialog
v1.27
Apr 5, 2026 · 2 changesFeatures
- Auto-close POS receipt modal when customer selects via terminal
Fixes
- Wire all receipt delivery methods from terminal — print, email, SMS
v1.26
Apr 5, 2026 · 1 changeFeatures
- Live terminal status modal in POS during customer interaction
v1.25
Apr 5, 2026 · 3 changesFeatures
- Terminal connection status indicator in POS header
Fixes
- Notify terminal on all cart clear paths (hold, cancel, exchange, complete)
Other
- API docs v1.5, roadmap v4.10 (93 features), +16 tests
v1.24
Apr 5, 2026 · 6 changesFeatures
- Terminal logo via media library picker — choose or upload images
Fixes
- Export allFiltersState and loadProductsDataWithFilters to window
- Location filter — only show products explicitly assigned to location
- Skip inventory refresh for untracked products, preserve tracked flag
- Product location filter — use $and/$or for array field matching
- Disable and zero-out inventory fields when Track Inventory is toggled off
v1.23
Apr 5, 2026 · 1 changeFeatures
- Customizable terminal idle screen — branding, colors, signage integration
v1.22
Apr 5, 2026 · 7 changesFeatures
- Terminal Display settings tab — configure tipping, survey, idle screen
Fixes
- Real-time inventory check before cart add, block negative stock properly
- Wire display config to terminal app, add tipping flow to POS
- Status dot at Dynamic Island level, totals sticky bottom with safe area
- Cart totals sit below items instead of at bottom of screen
- Terminal full-width cart, Dynamic Island safe area, centered status screens
- Terminal app — full-screen immersive customer display
v1.21
Apr 5, 2026 · 3 changesFeatures
- Add SIMULATED_MODE to Terminal app — bypass NFC for testing
Fixes
- Add Tap to Pay as first-class payment method in charge modal
- Show Tap to Pay based on session terminal device, not Stripe readers
v1.20
Apr 5, 2026 · 2 changesFeatures
- Customer engagement features for Terminal app
Other
- Customer engagement — API docs v1.4, roadmap v4.00 (89 features), +21 tests
v1.19
Apr 5, 2026 · 2 changesFeatures
- Terminal Socket.IO namespace — real-time payment routing POS ↔ Terminal
Other
- Socket.IO payment routing — API docs v1.3, roadmap v3.90, +31 tests
v1.18
Apr 2, 2026 – Apr 5, 2026 · 16 changesFeatures
- TendPOS Terminal — dedicated Tap to Pay reader app
Fixes
- Terminal SDK — use tapToPay discovery + easyConnect, pass stripeLocationId
- Terminal app — call initialize() before discoverReaders
- Move StripeTerminalProvider to idle screen, not root layout
- Terminal token provider throws on failure instead of returning empty
- Terminal idle screen — delay SDK connect, retry on 'not initialized'
- Terminal app — always render StripeTerminalProvider, prevent navigation loop
- Terminal app — conditional StripeTerminalProvider, save tenantId on pair
- Tenant middleware extracts tenantId from terminal device JWTs
- Connection token endpoint accepts device tokens from terminal app
- Terminal store — use shared setDeviceToken/getDeviceToken/clearCredentials
- Skip tenant middleware for terminal pairing endpoint
- Terminal pairing endpoint — remove auth requirement, issue device token
- Terminal pairing code format — 6 hex chars, not 9-char dashed format
- Add expo-av dependency to Terminal app — required by @tendpos/shared sounds module
Other
- TendPOS Terminal app — API docs v1.2, CLAUDE.md, roadmap v3.80, +25 tests
v1.17
Apr 2, 2026 · 3 changesFeatures
- Terminal-to-POS device assignment for payment routing
Fixes
- Always show Default Payment Terminal dropdown in POS device edit modal
Other
- Terminal assignment API docs, Swagger annotations, roadmap v3.70, +tests
v1.16
Apr 2, 2026 · 9 changesFeatures
- Named terminal devices with pairing codes
Fixes
- Remove duplicate createDeviceCode handler causing double modal
- Create Device Code button not responding - add direct event binding
- Show Add Device errors inline in modal instead of behind it
- CSP violation on terminal device delete button — replace inline onclick
Improvements
- Merge Register Location into Add Device — one button, one action
Other
- Native POS lazy-load Stripe Terminal provider + lockfile update
- Add POS native gitignore
- Stripe Terminal docs, roadmap v3.60, CLAUDE.md, +61 tests
v1.15
Apr 2, 2026 · 1 changeFeatures
- Show registered Terminal locations and readers in settings
v1.14
Apr 2, 2026 · 4 changesFeatures
- Add Tap to Pay reader management to Settings > POS Devices
Fixes
- Terminal location registration failing — zipCode field name mismatch
- Terminal location dropdown empty — buildOptionsArray returns objects not HTML
Improvements
- Rename Tap to Pay Readers to Payment Terminals
v1.13
Apr 2, 2026 · 1 changeFeatures
- Stripe Terminal Tap to Pay integration
v1.12
Apr 2, 2026 · 13 changesFeatures
- Add Stripe card payment integration to POS terminal
Fixes
- Disable Stripe Link autofill on POS card element
- POS card payment shows card-only form instead of Stripe Link/wallets
- Time clock status response missing clockedIn field — POS always showed clock-in screen
- Handle 'already clocked in' gracefully in POS
- Remove permission gate from GET /shifts — employees can view own shifts
- CRUD-to-permission mapping too narrow — add module-specific patterns
- Remove employee:clock permission gate from time clock endpoints
- Stripe Elements 400 error in Connect mode — remove stripeAccount option
- Eliminate delay after POS PIN login — parallelize data loading
- POS showing PIN screen on 403 (permission denied) instead of only on 401
Improvements
- Standardize permission system — match UI to route actions
Other
- Update CLAUDE.md and fix 7 tests for POS/permission changes
v1.11
Apr 1, 2026 – Apr 2, 2026 · 71 changesFeatures
- Location-level PIN re-auth override in location edit modal
- PIN re-auth policy at tenant/location/role/employee levels
- Auto-redirect on session expiry + configurable PIN re-auth policy
- Visual icon picker grid for ingredient modifier actions
- Tenant portal UI for ingredient modifier action buttons
- Dynamic ingredient modifier action buttons from tenant settings
- Conversational ingredient modifier UI in POS
- Unified POS modal — variants + modifiers + qty in one flow
- Storefront modifier polish — quantity spinners, freeform, prices in cart (#149)
- Inline recipe & ingredients in product edit panel (#148)
- Show location name in POS header bar
- Add search box to modifier groups selection modal
- FilterDropdown utility — auto-convert all filter selects to styled dropdowns (#147)
- Adjust inventory deduction based on ingredient modifiers (#143)
- Add modifier selection UI to storefront product detail (#142)
- Ingredient-based modifiers from recipe ingredients (#141)
Fixes
- Pass locationId to API for server-side product filtering with correct pagination
- Apply location filter to product list -- empty locationIds = available nowhere
- Remove ~330 lines of dead event delegation from team-management.js
- Second code path also hiding inventory section for variable products
- Show inventory tracking toggle for variable products
- Apply CRUD-to-POS action mapping in cached hasPermission too
- Map POS-specific permission actions to CRUD equivalents
- Location phone/email fields not persisting after save
- CSP violation on location POS settings toggle
- editLocation not defined error + invalid regex pattern on slug field
- Make POS ingredient action buttons solid fill instead of outline
- Revert location filter - keep strict location assignment
- Products with no location should show at all POS locations
- POS variant selection skipping to modifiers (#154)
- Use employee:clock permission for time-clock status endpoint (#152)
- Remove promotions:read permission gate from POS promotions endpoint (#151)
- Register promotions feature key in feature system (#150)
- Use link.linkId instead of link._id for recipe link references
- POS variant matching for simple variants (no optionValues)
- POS variant modal — normalize API field names + fallback for simple variants
- POS variant selection — check product.variants not variantOptions
- Location filter now applies to product table rendering
- Location toggles show assigned state, not inverse of disabled
- Empty locationIds means unassigned, not available everywhere
- Simplify location availability to single toggle per location
- Remove stale categorySelect reference in editProduct
- Replace edit panel category select with multi-select picker
- Style ALL selects across ALL templates including modals
- Load wizard modal template + modifier script before showing wizard
- Make all location dropdowns nested with parent/child hierarchy
- Clear category search field after selecting a category
- Category toggle reads data-category-id/name attributes
- Add null checks for getAttribute in team-management click handler
- Move ALL 67 dead event listeners into initProductFilterBindings
- Load ingredient/recipe/component/modifier scripts on products page
- Restore product edit panel template + fix click handlers
- Restore full product table click handlers (edit, actions, expand)
- Auto-initialize tab switching in router for all pages
- Exclude hidden selects from FilterDropdown enhancement
- Move all product filter listeners to onMount for DOM timing
- Match stock/status filter styling to location dropdown
- Move filter event listeners to onMount (DOM timing fix)
- Wire product filter buttons and add nested location dropdown (#146)
- Wire up orphaned product filter buttons (stock levels, locations) (#145)
- Wire modifiers to inventory deduction + docs + tests (#144)
- Sidebar not filling full height in tenant portal (#140)
- Make ALL location dropdowns hierarchical and alphabetically sorted (#138)
- Handle expired session tokens in POS time clock check (#137)
Improvements
- Unify product location filter into single code path
- Move all non-local event delegation to owning modules
Other
- Comprehensive documentation, roadmap, and test update
- Fix 4 additional test failures from PR merge
- Fix 14 failing tests after merge with main
- Update API docs, tests, and roadmap for promotions and time-clock fixes (#153)
- Add LocationUtils tests and bump version (#139)
v1.10
Mar 25, 2026 · 5 changesFixes
- Auto-close popup window after Stripe onboarding completes
- Move onboarding return/refresh before auth, remove unused imports
- Replace iframe payment setup with direct Express onboarding popup
- Show payment setup form immediately, load progress async
- Suppress openPaymentSetupModal warning, fix embedded SW check
v1.9
Mar 25, 2026 · 4 changesFixes
- Sidebar scrolls with page content instead of staying sticky
- Sidebar stretches full page height with sticky positioning
- System health check reads Stripe key from DB instead of env var
- Make sidebar sticky and full-height on desktop
v1.8
Mar 25, 2026 · 2 changesFeatures
- Per-location payout routing with white-label bank account management
Fixes
- Pre-fill payment setup form with tenant business info from localStorage
v1.7
Mar 25, 2026 · 2 changesFeatures
- Pre-fill Express account creation with tenant/location data
Fixes
- Fix 3 field persistence bugs found in comprehensive audit
v1.6
Mar 25, 2026 · 1 changeFeatures
- Open bank account setup in styled popup with waiting modal
v1.5
Mar 25, 2026 · 2 changesFeatures
- Open payment setup in modal instead of new tab
Fixes
- Expose location functions to window, skip SW in embedded iframe
v1.4
Mar 25, 2026 · 3 changesFeatures
- Replace Stripe Checkout with in-app payment form for plan upgrades
Fixes
- Handle invalid Connect accounts in legacy stripeConnectController
Other
- Update all docs, tests, roadmap for per-location payments and white-label
v1.3
Mar 25, 2026 · 1 changeFeatures
- White-label all payment UI - remove Stripe branding
v1.2
Mar 24, 2026 · 1 changeFixes
- Handle invalid/revoked Stripe Connect accounts gracefully
v1.0
Feb 5, 2026 – Mar 24, 2026 · 538 changesFeatures
- Per-location Stripe Connect accounts for bank account routing
- Add Stripe Test Connection button and fix Connect field save/load
- Add Help Center with knowledge base, onboarding checklist, and context help
- Add per-location Stripe statement descriptor
- Add direct Stripe credentials override for tenants
- Add marina booking confirmation emails and modification system
- Show payment requirement on review step before booking
- Product catalog assignment for marina revenue tracking
- Dynamic vessel fields — drag reorder, field types, custom fields
- Configurable vessel fields for marina — tenant-wide setting
- Customer account login/register on marina booking with vessel management
- Welcome back flow for returning marina booking customers
- Show 'not available' splash when online booking is disabled
- Support location-specific URLs for marina booking
- Per-location marina scheduling settings with override model
- Replace plain date input with visual availability calendar in marina booking
- Add seasonal open/close dates for marina scheduling
- Full scheduling control — hours, blocked dates, durations, online toggle
- Create Transaction records from marina booking payments
- Payment processing for marina bookings
- Public marina booking portal for customers
- Add Marina Scheduling Settings page
- Marina scheduling & reservation system
- Dynamically show/hide earnings based on commission and tip eligibility
- Staff announcements system with auto-triggers
- Management roles can claim any shift regardless of job title
- Eligibility filtering for open shifts and swap pickups
- Show open shifts in team schedule with Pick Up button
- Add Offer Swap and Give Away buttons to Staff Portal schedule
- Support open/unassigned shifts in schedule builder
- Support open/unassigned shifts in schedule builder
- Per-location scheduling settings with override-only model
- Configurable shift swap policies with tenant settings
- Enforce location requirement and employee assignment validation for shifts
- Hide time clock UI in Staff Portal when disabled by tenant
- Add time clock settings with geofencing support
- Auto-trigger commission calculation on transaction completion
- Add employee commissions, tip tracking, and employee discounts
- Add team schedule view to staff portal (#122)
- Inline approve/deny buttons on pending time-off in schedule grid (#121)
- Schedule builder shows time-off requests and blocks approved days (#119)
- Add none, commission, and contractor pay types to job titles (#114)
- Add hierarchy level to job titles (#110)
- Add manager hierarchy and approval routing UI (#109)
- Add Staff Portal to docker-compose and deploy script
- Add employee invite & onboarding flow via Staff Portal
- Add Staff Portal — employee self-service app
- Add printable daily/weekly/monthly schedule views
- Multi-day shift creation, fix 500 error and paid checkbox
- Add scheduled break times to shifts
- Add drag-and-drop shift rescheduling to schedule builder
- Filter schedule grid employees by selected location
- Add LocationUtils for hierarchical location dropdowns
- Add employee scheduling & time-tracking system
- Replace lock icon with upgrade icon for feature-gated sidebar items (#93)
- Add full cash/register management system across all layers
- filter locations dropdown to only show locations with products assigned
- Real-time POS product updates via Socket.IO
- Two-column KDS settings layout with persistent settings
- Add native iOS/Android apps monorepo (React Native + Expo)
- Resolve TODOs, fix bugs, and add Accounting module (#15)
- Route app.tendpos.com directly to tenant portal
- Route app.tendpos.com directly to tenant portal
- Route app.tendpos.com directly to tenant portal
- Add pre-commit/pre-push hooks and deploy tests
- Add push notifications for chat escalations
- Add Customer Chat to Admin sidebar navigation
- Integrate customer chat widget into Storefront
- Add AI customer chatbot for support and order inquiries
- Add Stripe Elements payment integration for storefront checkout
- Add path-based slug routing for storefront
- Add location slug field for subdomain routing
- Add nginx configuration for storefront subdomain routing
- Add dynamic theming and enhanced storefront features (#14)
- Add comprehensive e-commerce integration
- Add comprehensive hardware integration for POS terminals
- Add analytics enhancements - charts, scheduled emails, dashboard customization
- Add Advanced Analytics Admin UI
- Add Advanced Analytics suite with 4 major features
- Add unified version tracking system across all apps
- Add push notifications to PTT/staff messaging
- Add Push Notifications Phase 2 - order triggers, inventory alerts, and tenant dashboard
- Add notification bell and auto-prompt in tenant portal
- Add push notification order triggers and Admin dashboard UI
- Add push-utils.js script to Admin portal
- Add push notification system with Web Push and APNs support
- Add PWA support across all TendPOS applications
- Add AI Customer Insights module with RFM segmentation and churn prediction
- Complete digital signage system (Phases 1-5)
- Add POS promotions quick-select integration
- Add promotions and coupons management UI
- Add tax rate change detection and notification system
- Add complete 50-state tax coverage
- Add complete county coverage for WA and IL tax providers
- Add state tax providers for FL, NY, WA, IL, PA
- Add online booking settings UI in tenant portal
- Add tenant management API for online booking settings
- Add online booking system for service verticals
- Support location-specific slugs for online ordering
- Full inheritance model for online ordering settings
- Add customer storefront and enhanced settings UI for online ordering
- Add Online Ordering UI to tenant portal
- Group plan features by category in Admin portal
- Implement Online Ordering System for restaurants, cafes, and retail
- Implement Fitness & Recreation vertical with full test coverage
- Add UptimeRobot integration with public status page
- Add Resend API as email provider option
- Add complete Property Management vertical
- Add Automotive vertical frontend pages
- Add complete Automotive vertical with work orders, vehicles, and inspections
- Add comprehensive Salon & Spa vertical
- Add vertical bundle support for location-based features and deploy script
- Add vertical selection to bundle management modal
- Add comprehensive marina frontend modules
- Add search bar to subscription feature management
- Add variant-templates routes to Admin portal
- Implement tax data provider optimization system
- Implement 4 new marina vertical features
- Implement Enhanced Security feature for enterprise customers
- Implement Webhook system for third-party integrations
- Add Hetzner deployment configuration
- Implement AI Business Assistant feature
- Implement Marina Mooring Management feature
- Implement AI Inventory Forecasting feature
- Implement Multi-Location Inventory feature
- Add Product Variations UI components
Fixes
- Suppress toggleLocation warning in team-management click handler
- Allow 0% application fee without reverting to 2.9% default
- Clear settings cache after save so Connect fields persist on reload
- Move testStripeConnection to correct controller (systemSettingsController)
- Fix nested template literal syntax error in tenant modal
- Clear time slots when navigating months on marina booking calendar
- Don't re-fetch calendar when selecting a date on marina booking page (#133)
- Use merged tenant+location config for marina booking payment check (#132)
- Enforce payment requirement for marina online bookings (#131)
- Resolve Mongoose type keyword conflict in StorageRetrieval vessel schema and make unitId optional (#130)
- Handle vesselInfo from online bookings and make unitId optional
- Show validation error details on booking submission failure
- Use p._id || p.id for product result data-id attribute
- Store product IDs in JS state instead of relying on hidden inputs
- Dedicated product-assignments endpoint with dot-notation save
- Sanitize product IDs on save — strip 'undefined'/'null' strings
- Always load product IDs from tenant config, not location overrides
- Save product IDs to tenant level even when location selected
- Remove conflicting dot-notation that caused MongoDB error
- Handle deleted products gracefully in marina settings
- Force product IDs via dot notation + add debug logging
- Change product ID fields to String type to persist correctly
- Skip product fetch for null/undefined product IDs
- Send null instead of undefined for product IDs so they persist
- Handle vessels without name in deduplication key
- Use Mixed type for savedVessels to support dynamic fields
- Use accessToken from auth response, not undefined 'token' field
- Remove hardcoded vessel name requirement — respect tenant config
- Replace product dropdowns with searchable typeahead
- Correct customer portal API paths — remove extra /portal/ segment
- Step 3 blank page — querySelector matched button instead of step div
- Display time slots in 12-hour format on marina booking page
- Hide service cards based on location config
- Check online booking at location level, not tenant level
- Return 404 for non-marina tenants on public booking URL
- Only show marina-vertical locations in marina settings and booking
- Resolve marina scheduling config with location overrides
- Add Stripe to CSP whitelist for marina booking payments
- Fix marina booking page — icon path, CSP, deprecated meta
- Show 'First L.' names and 'Open/Available' in schedule builder
- Display staff names as 'First L.' in Staff Portal
- Improve schedule builder controls layout for small screens
- Style Delete shift button as red danger button
- Change 'Missing required job title' to 'No applicable job title'
- Hide cancelled and denied swaps from My Requests view
- Replace raw browser alert/confirm/prompt with ModalSystem equivalents
- Replace all browser alert/confirm/prompt with inline UI in Staff Portal
- Reset published status when a shift is edited
- Soften job title validation to warning instead of blocking shift creation
- Sort location dropdowns alphabetically at each hierarchy level
- Use hierarchical LocationUtils for all location dropdowns
- Use default export with onMount for scheduling settings controller
- Move /settings routes before /:id in timecards router
- Show friendly shift status labels in Staff Portal schedule
- Include shifts with no location in team schedule query
- Show all tenant shifts in team schedule for users with no locations
- Block day toggle buttons for employees with time off (#120)
- Reports To dropdown now includes users by job title hierarchy (#117)
- Add none, commission, contractor pay types to team member form (#116)
- Team page Roles and Permissions tabs not responding to clicks (#112)
- Use hierarchical API for employee location checkboxes (#111)
- Constrain SVG icon sizes in Staff Portal more menu (#108)
- Inline styles on invite email button for readability (#107)
- Bump admin service worker cache version and fix roadmap HTML nesting (#106)
- Pass STAFF_URL and ADMIN_URL env vars to API container (#105)
- Load email provider from database even when SMTP env vars exist
- Close dashboardPage div to fix admin navigation
- Use localStorage for admin dashboard widget preferences
- Fix test failures from tenant JWT fallback and select query
- Tenant resolution, team management bugs, onboarding tracker, and admin errors
- Staff Portal tenant ID resolution and add address autocomplete to onboarding
- Handle plain object mocks in profile toObject check
- Prevent Mongoose cast error when spreading profile subdocument
- Add getStaffUrl mock to emailService test
- Force native checkbox appearance for paid break toggle
- Show all employees as clickable rows in schedule grid
- Move templates dropdown out of page-header to avoid overflow:hidden
- Schedule builder header buttons layout and dropdown visibility
- Templates dropdown showing on page load in schedule builder
- Paginate employee API calls to respect limit=100 validation
- Register report aggregation error - simplify pipeline (#97)
- POS hardware settings insertBefore DOM error (#96)
- Resolve 3 errors on Register Sessions page (#95)
- Preserve sidebar context when app.js re-renders after app-main.js (#94)
- Add Register Sessions link to hardcoded sidebar in app.html
- Page refresh shows blank content due to module load timing race (#92)
- Nested sidebar sub-menu items not navigating
- POS launch URL uses wrong domain
- POS/KDS web apps missing shared assets in Docker
- suppress startup warnings for duplicate indexes and reserved keys
- remove stray closing bracket crashing invoices page
- Pre-launch audit — RLS, feature gating, security patches (#82)
- Test coverage + raw confirm() cleanup (#81)
- Guard initModalTracker calls in page modules (#79)
- Declare locations cache variable in settings module (#78)
- Add explicit text color to analytics page header dropdowns (#77)
- Render layout templates inline and fix playlist response parsing (#76)
- Prevent double initialization of signage sub-modules causing duplicate modals (#75)
- Replace inline onclick handlers with data-action event delegation in signage JS (#74)
- Parse API response correctly for signage playlists and layouts (#73)
- Use correct DOM IDs for signage playlist and layout rendering (#72)
- Fix signage playlist and layout pages stuck on loading (#71)
- Add missing helpers and auto-load content in signage content manager (#70)
- Fix 'await if' syntax error in signage page controllers (#69)
- Correctly extract registration code and expiry from API response (#68)
- Prevent double JSON.stringify in signage fetchAPI helper (#67)
- Replace inline onclick handlers with event delegation in signage (#66)
- Use correct /api/signage/analytics endpoint on dashboard (#65)
- Add missing fetchAPI and showToast helpers to signage module (#64)
- Use correct /api/users endpoint in marina work orders (#63)
- Prevent infinite recursion in ai-features showNotification (#62)
- Use .option() for Mongoose 8 aggregate maxTimeMS (#61)
- Convert report schema objects to arrays for client iteration (#60)
- Use window.apiCall() in report-builder for correct auth headers (#59)
- Replace inline onclick handlers with event delegation in goals.js (#58)
- Surface AI provider errors clearly on briefing generation (#57)
- Suppress console errors for missing briefing and generate on refresh (#55)
- Show friendly empty state when no AI briefing exists yet (#54)
- Add console.error logging to products page catch block
- Bind sidebar menu toggle events for hardcoded HTML sidebar
- Resolve blank dashboard on refresh and sidebar nav not working
- Fix sidebar navigation and Add Product modal null error
- Fix dashboard buttons and bump service worker cache version
- Move orphaned event bindings to correct page modules and fix cross-module references
- Add null safety to top-level DOM access in product-management and customers modules
- Revert optional chaining on property assignments (invalid LHS)
- Add optional chaining to all getElementById calls across frontend
- Add optional chaining to all top-level getElementById calls
- Add null checks for DOM elements accessed at module load time
- Remove duplicate deleteCategory and escapeHtml function declarations
- Remove duplicate processPayment function in pos-inline.js
- Remove duplicate function declarations in pos-inline.js
- Add unsafe-inline to CSP scriptSrc for import map support (#51)
- Resolve flaky classesBookings test late_cancel timing issue
- Update transactionPaymentController test to use transactionStateController for completeTransaction
- Update workOrder route test for sub-router mounting pattern
- Update signage route test for sub-router mounting pattern
- Update inventoryCoreController reference to inventoryQueryController in tests
- Update tests for controller split and deleted tenantController
- Socket auth checks wrong field — isActive vs status:'active'
- Simplify product location filtering — remove redundant disabledLocationIds
- PIN login matches wrong user when multiple share same PIN
- Polish native POS/KDS — safe area insets, auto-submit PIN, dynamic threshold constraints, correct API endpoints
- Prevent race condition clearing credentials during device re-registration (#23)
- Add error codes to posAuth 401 responses for native app deactivation handling (#22)
- Align native POS app API payloads with backend expectations (#21)
- Add locations to pin-only-login select to fix location check (#20)
- Native app bug fixes, icons, and user location populate (#19)
- Remove deprecated POS Screens stub and replace with Device Codes nav link
- Make socket emit null-safe in KDS bump/recall routes
- Repair broken button handlers across portals
- Silence realtime-dashboard warning in Admin portal
- Add cdn.socket.io to Admin CSP for Socket.IO and Chart.js
- Use warn level for Redis status logs so they appear in production
- Make rate limiter dynamically check Redis connection
- Improve Redis connection retry logic for Docker environments
- Silently skip realtime dashboard when no tenant context
- Load Socket.IO from API server for Admin portal
- Admin portal console errors
- Only load AI briefing when AI Insights page is visible
- Load Socket.IO client for realtime dashboard
- Require tenant ID for AI API calls on login page
- Update all app links to use app.tendpos.com
- Eliminate console errors on login page
- Enable trust proxy for correct hostname detection behind nginx
- Resolve flaky Table test and update deprecated packages
- Improve test reliability for product search and transactions
- Increase MongoDB Memory Server launch timeout to prevent test flakiness
- Add missing closing div tag in product roadmap
- Resolve failing tests in pushRoutes and backupController
- Use --no-verify for deploy script git push
- Use partial index for Location slug uniqueness
- Add missing closing div tag in product roadmap
- Mobile UX polish for Admin, POS, and KDS apps
- Mobile UX polish for storefront
- Include config directory in Docker build
- Remove extra closing brace in emailService.js
- Resolve test failures for push notifications and models
- Convert onclick to addEventListener with null checks
- Add node-schedule dependency for goal tracking job
- Use Docker network for health check
- Add Tend-icon.png to Admin shared files
- Include POS/KDS/Signage package.json in API container
- Update icon references from Tend_icon.png to Tend-icon.png
- Ensure notification auto-prompt fires for all login paths
- Only cache GET requests in main app service worker
- Load notification-settings.js right after app-main.js
- Replace inline onclick with addEventListener for CSP compliance
- Add page visibility checks to signage scripts
- Show Admin Portal subscriptions in top tenants list
- Update Admin service worker static assets to existing files
- Filter out null tenantId in push stats top tenants
- Prevent API calls before authentication and fix CSP violation
- Add flexible auth token lookup in push-utils.js
- Make tenantId optional for admin app push subscriptions
- Fix infinite recursion in _getAuthToken()
- Support multiple auth token storage keys in push-utils
- Move service worker registration to external file for CSP compliance
- Add push-utils.js to resolve-symlinks script
- Add push-utils.js symlink to Admin portal
- Use correct adminOnly middleware in admin push routes
- Add missing closing div tag in product roadmap
- Remove inline event handlers to comply with CSP
- Remove unused axios/cheerio imports from floridaProvider
- Use correct location ID field when auto-selecting single location
- Convert Mongoose subdocuments to plain objects in storefront API
- Improve settings inheritance merge logic in public storefront API
- Update storefront.js to work with public API response structure
- Online ordering settings not persisting
- Ensure all online ordering settings persist for tenant and location
- Slug not persisting when location is selected
- Online ordering settings not persisting after save
- Prevent deploy loop by auto-committing build artifacts
- Enable previously skipped tests by implementing missing features
- Resolve timezone issues in salon models and tax projection test
- Increase Jest test timeout to 60 seconds
- Add missing feature categories to Admin portal
- Online Ordering test fixes and model improvements
- Property Management model validation and test fixes
- Return 503 instead of 500 when UptimeRobot not configured
- Move status page inline styles/scripts to external files for CSP compliance
- Update Admin portal CSS with peer-checked classes for toggle switches
- Fix permissionModules.js syntax error - property module was outside array
- Check location verticals for feature access
- Restart nginx after container rebuild to refresh DNS
- Handle paths with spaces in deploy script
- Check all locations for verticals, not just the first one
- Remove auto-init from contract scripts to prevent race condition
- Prevent contract scripts from firing API calls on login page
- Bundle creation sends wrong field names to API
- Only init variant-templates when logged in and on correct page
- Copy VariantOptionTemplate model to Admin for Docker compatibility
- Use relative URLs in Admin JS files for production
- Replace Admin symlinks with actual files for production
- Add missing headers object to authController test mock
- Remove problematic cron schedule from JSDoc comment
- Remove duplicate nginx resolver directive
- Fix Admin weekly digest import path for Docker compatibility
- Docker deployment improvements and nginx configuration updates
- Add missing nanoid dependency and fix JSDoc syntax
- Ensure indexes before testing unique key constraint
- Add missing model imports to test files for schema registration
- Security and performance audit with CI improvements (#10)
- Correct z-index stacking for variant management modals
Improvements
- Replace 30 parallel availability requests with single bulk endpoint
- Remove manual time slots, auto-generate from operating hours + duration
- Move scheduling settings to its own page under Scheduling sidebar
- Group scheduling/timecard items under Staff submenu in sidebar
- Migrate sidebar from hardcoded HTML to data-driven config
- Query optimization - $facet aggregation, .lean(), tenant caching
- Exclude backups/ directory from deploy rsync
- Optimize dashboard stat card loading
- Split 8 large services and 4 route files into focused sub-modules
- Defer 58 script tags from app.html to on-demand lazy loading
- Extract 5,000 lines of modal HTML from app.html into lazy-loaded templates
- Split 5 remaining large route files into sub-modules
- Split 5 mid-tier controllers into focused sub-modules
- Split 6 large route files and squareDataMapperService into sub-modules
- Split 3 largest controllers into focused sub-modules
- Final app-main.js cleanup + delete dead tenantController monolith
- Extract auth, POS auth, and onboarding from app-main.js into modules
- Split squareMigrationService.js (3994 lines) into domain sub-modules
- Complete tenantController.js split - route monolith fully eliminated
- Extract email templates from emailService.js into focused modules
- Split signageController.js (2063 lines) into 7 focused controllers
- Split posAuth.js (4651 lines) into 7 focused route modules
- Optimize deploy pipeline — eliminate redundant test runs
- Simplify POS PIN login screen — remove employee selection and auto-submit
- Extract sidebar and product management from app-main.js
- Extract POS system from app-main.js into ES module
- Extract settings logic from app-main.js into ES module
- Extract heavy page logic from app-main.js into ES modules
- Extract core page logic from app-main.js into ES modules
- Extract marina pages from app-main.js into standalone modules
- Extract kitchen stations page logic from app-main.js into ES module
- Extract tables, returns, loyalty page logic from app-main.js into ES modules
- Consolidate controller subdirectories under parent groups
- Modularize tenant portal into template-loading SPA (#26)
- Comprehensive performance optimizations
- Improve deploy script reliability and options
- Add MongoDB connection pooling and Redis caching for auth
Other
- Update Stripe API version to 2026-02-25.clover (latest)
- Update Stripe API version from 2023-10-16 to 2025-12-18.acacia
- Expand help articles to 42 across 15 categories
- Add tests, API docs, roadmap, and CLAUDE.md for direct Stripe feature
- Mock usesDirectStripe in marina booking tests
- docs/test: Update marina API docs and add 134 tests for booking fixes (#134)
- Remove debug console logs from marina scheduling settings
- Add console logs to trace product search init and selection
- Add console logs to trace product ID values at save time
- Complete compliance — tests, API docs, CLAUDE.md
- Add missing Swagger, tests, roadmap, and API docs for compliance
- Ignore .claude directory in gitignore
- Ignore .claude directory
- Add scheduling route tests
- Comprehensive documentation and test coverage for scheduling features
- Show job title next to name in Reports To dropdown (#118)
- Remove pay type/rate from job title create and edit (#115)
- Change hierarchy level from number input to labeled dropdown (#113)
- Update ensureTransporter test to match DB-priority behavior
- Remove debug console.log from Staff API client
- Make modal overlay much more transparent with blur effect
- Fix modal overlay — use inline style to avoid Tailwind rewriting
- Fix modal overlay to show page behind with lighter backdrop
- Make modal overlays lighter to show page content behind
- Fix delete button layout in shift edit modal
- Add location validation when saving schedule template
- Swap location/company name order in print header, remove address
- Fix location API URL in schedule view print
- Add business info to print view and staff filter to schedule view
- Add dedicated Schedule View page with daily/weekly/monthly views
- Fix last 2 duplicate Mongoose index warnings
- Fix remaining duplicate Mongoose index warnings
- Fix mock chains for .lean() additions in admin/report controllers
- Add 8 missing API docs, fix console.log, move pm2 to devDeps (#83)
- Update resolved symlink for product-roadmap
- Fix 6 stale test files and exclude migrations/scripts from coverage (#50)
- Add 283 tests for 5 service sub-module groups (#49)
- Boost 13 low-coverage services from <60% to 92-100% coverage (#48)
- Add 1,236 tests for tax provider system (0% → 94.7% coverage)
- Add 671 tests for 12 untested service files
- Temporarily elevate POS socket logs to WARN for production debugging
- Fix tests for locationIds-only filtering and flaky timing assertion
- Update tests for locationIds-only product location filtering
- Compact KDS settings panel spacing for less scrolling
- Update sub-package lock files
- Add ingredient service tests
- Add service tests for location, vendor, and tax services
- Add employeeService tests (18 tests)
- Add cartService tests (26 tests)
- Add subscriptionFeatureService tests (25 tests)
- Add CI/CD deployment, fix duplicate indexes, enhance monitoring
- Add Node 20+ engine requirement and update dependencies
- Update canvas to 3.2.1
- Add .nvmrc to enforce Node 20 for development
- Update dependencies to fix security vulnerabilities
- Add chatEscalationNotificationService to CLAUDE.md
- Add escalation notification docs and tests
- Add Customer Chatbot system documentation to CLAUDE.md
- Add comprehensive tests for AI Customer Chatbot
- Update roadmap HTML formatting
- Update mobile responsiveness guide with actual implementation
- Add e-commerce API documentation and roadmap updates
- Remove duplicate hardware-integration from future roadmap
- Add hardware integration tests
- Clean up roadmap - remove completed/duplicate future items
- Add scheduled reports and new chart types to CUSTOM_REPORTS_API
- Add Advanced Analytics API documentation
- Add API documentation and tests for Advanced Analytics
- Add API documentation and tests for Advanced Analytics
- Add Tend-icon.png to Admin images
- Complete QA testing pass - all 12 areas verified
- Update QA testing log with initial pass results
- Sync resolved symlink for product-roadmap.html
- Rename Tend_icon.png to Tend-icon.png
- Add PTT push notification tests and update docs
- Add push notifications to CLAUDE.md and create test suite
- Remove console logs from Admin service worker and fix issues
- Remove console logs from service worker and PWA utils
- Add resolved push-utils symlink
- Add VAPID env vars to docker-compose for push notifications
- Add comprehensive PWA documentation and guidelines
- Sync resolved symlink for product-roadmap.html
- Add Swagger/OpenAPI annotations to all 66 route files
- Add comprehensive tests for Digital Signage, Tax, and Promotions
- Add comprehensive tests for Digital Signage system
- Update landing page stats for Digital Signage release
- Add Digital Signage API documentation and roadmap entry
- Update roadmap with tax rate detection and POS promotions
- Add comprehensive tests for online ordering and booking
- Add comprehensive tests for coupons and tax rate changes
- Add tests for getPromotionsForPOS endpoint
- Update documentation for 50-state tax provider coverage
- Add location-specific slugs and inheritance model to Online Ordering API
- Update roadmap HTML
- Update roadmap HTML
- Rebuild CSS and update roadmap for deployment
- Update roadmap HTML
- Rebuild CSS and update roadmap for deployment
- Update roadmap HTML
- Rebuild CSS and update roadmap for deployment
- Update roadmap with Property Management vertical
- Update roadmap HTML
- Build CSS and update roadmap for deployment
- Add comprehensive tests for salon/beauty vertical
- Add mandatory documentation requirements to CLAUDE.md
- Update Admin roadmap with salon feature
- Add Swagger docs and API reference for Salon vertical
- Rebuild CSS and roadmap for deployment
- Rebuild CSS and roadmap for deployment
- Add mandatory deployment script instructions to CLAUDE.md
- Add Hetzner deployment info to CLAUDE.md
- Register tax provider cron jobs in app startup
- Add API documentation for tax provider optimization
- Add API documentation for 4 marina features
- Add comprehensive tests for marina features
- Add API documentation for Enhanced Security feature
- Add Enhanced Security to roadmap as released feature
- Add API documentation for Webhooks and AI Business Assistant
- Update documentation with AI features, deployment info, and caching
- Add AI Inventory Forecasting to released features
- Add Multi-Location Inventory documentation and update roadmap
- Add Product Variations documentation and update roadmap
- Add ensureIndexes() to TenantModifierGroup unique test
- Fix test-on-pr.yml to use consistent test flags
- Lower coverage threshold and restore parallel tests
- Run tests in band to avoid worker exit issues
- Add --forceExit to Jest for clean CI exit
- Add ensureIndexes() to unique constraint tests
- Full codebase audit: ESLint fixes and test suite stabilization (#9)
- Add automated Claude Code + CodeRabbit integration
- Add mandatory Git workflow to all Claude documentation