All releases
August 2026

August 2026 Updates

Aegis gains a MoveBuddha inventory document, intake forms support late-mounted SPA containers, and a new 3001.5 calendar-events report adds the Estimator column.

Newsletter status: In progress. See README.md for conversion guide.

v2608.21.2 — August 21, 2026

MRs: !2279, !2278

Fixes

  • Can’t add transactions to jobs in area zones — context resolution fixed (!2279)
  • Vancouver Island estimate: per-event tax breakout, GST number, charge price resolution (!2278)
  • Per-event summary rows labeled and carried to the invoice (!2278)

Other

  • Aegis requirement comments and lockfile version sync (!2278)

v2608.21.1 — August 21, 2026

MRs: !2276

Features

  • Apex calculator with custom estimates for instant-estimates (!2276)
  • createDocument function added to scripts for programmatic document generation (!2276)
  • Apex default and long estimate templates (!2276)

Other

  • Apex calculator and templates added to functions (!2276)

v2608.21.0 — August 21, 2026

MRs: !2277, !2275, !2273

Highlights

AEGIS wired for document generation in crew navigator (!2277) The crew navigator now uses AEGIS for document generation instead of pre-generating contracts. This removes the old pre-generation flow and connects the navigator directly to the AEGIS document engine.

Custom YMM Aegis templates (!2275) Multiple custom YMM Aegis document templates have been added, including estimates, invoices, reminders, and a moving checklist — all ported from their PandaDoc originals with matching layouts.

Area zone login fix deployed (!2273) Users who were getting stuck with empty dashboards after logging in are now fixed — the login flow only resolves franchise, corporate, business-group, root, and container zones as context targets, excluding area zones.

Features

  • Custom YMM Aegis templates: estimates, invoices, reminders, moving checklist (!2275)
  • YMM moving checklist ported from source artwork (!2275)
  • AEGIS wired for document generation in crew navigator (!2277)

Fixes

  • Area zone context resolution — excludes area zones from mintJWT and MCP token auth (!2273)
  • Vancouver Island estimate matched to PandaDoc original (!2275)
  • YMM estimate split into its three real documents (!2277)
  • Transaction-fee estimate signer role corrected (!2277)
  • YMM template layout fixes (!2275)
  • Aegis template field declaration fixes (!2275)
  • Zone retrieval for doc config fixed (!2277)

Other

  • Functions version bumped to 2608.20.1 (!2275)

MRs: !2274, !2272, !2271, !2270, !2269, !2266, !2265

Highlights

Claude MCP integration improvements (!2272) MoveRight’s Claude MCP connector now works correctly for zone admins — the mcp.access permission and wildcard *.* are properly checked when selecting a contextable role. Two new MCP tools were added: report_issue opens a ticket with the Move Right development team, and list_resources shows recently created and updated jobs in the current zone with job code and customer name.

Auth login fixes — area zones no longer block users (!2271) Users like MJ McDowell were getting stuck with empty dashboards because the login flow was resolving to area zones (e.g. Alaskan Time Zone) instead of franchise zones. Now only franchise, corporate, business-group, root, and container zones are valid context targets — area zones are excluded. Auth permissions are also now checked using the new permission graph instead of Neo4j.

Release of Liability documents ported to Aegis (!2269) The Claims Release V2 fields have been ported to Aegis input fields, and the Release of Liability template pair is now available. Signer roles are read from the template declaration instead of being hardcoded.

Features

  • report_issue MCP tool — opens a ticket with the Move Right development team from Claude (!2272)
  • list_resources MCP tool — lists recently created and updated jobs in the current zone (!2272)
  • MCP resources now include recent jobs as readable resources (moveright://jobs/<id>) (!2272)
  • Release of Liability template pair + Claims Release V2 field port (!2269)
  • Vancouver Island estimate matched to its PandaDoc original (!2270)
  • Single-unit Aegis templates for Faith & Family, Movers Assistance, Turpin, Vancouver in the Box, Tap Tap, Braylor, MM estimates (!2265, !2269)

Fixes

  • Zone admins getting “Missing permission mcp.read” when calling MCP tools across zones (!2272)
  • MCP OAuth “Failed to start MCP authorization” — authorization_servers now points to our backend instead of FA directly (!2268)
  • MCP OAuth email fallback — fetches email from FA user API since introspection doesn’t return it (!2268)
  • Area zones (time zones, service areas) resolved as user’s context zone causing empty dashboards (!2271)
  • Auth permissions checked on login using the new permission graph instead of Neo4j (!2271)
  • User page goes blank after opening for the first time (!2266)
  • Charge reordering issue (!2274)
  • Vancouver Island estimate made non-signable, parity gaps fixed (stops in, move date out) (!2270)
  • Liability release signature layout matched to PandaDoc original (!2265)

Other

  • zone_admin role gets explicit mcp.* permissions with allZones: true (!2272)
  • SHARED_ADMIN_PERMISSIONS updated with mcp.* permissions (!2272)
  • Aegis review script: render multi-variant templates, never leave stale review (!2269)
  • Single-unit PandaDoc references seated in aegis-review (!2265)

MRs: !2268, !2267

Highlights

OTR Ops Readiness dashboard now correctly detects signed documents (!2268) The Customer Packet Signed column was blank for OTR jobs because the dashboard only matched “Customer Packet” and “Moving Contract” document types — OTR jobs use “OTR Customer Packet”. Now matches all contract variants including state-specific contracts, BOL variants (FVP, Released Value, PVP), and visual inventory PDFs uploaded without docType metadata.

Claude MCP OAuth connection fixed (!2268) Claude.ai was failing with “Failed to start MCP authorization” because the protected resource metadata pointed to FusionAuth’s domain (which doesn’t serve OAuth discovery) instead of our backend. Now points to moveright.app where the metadata is served. Also: MCP OAuth now fetches email from the FA user API for the email fallback (introspection doesn’t return it), prefers roles with mcp.access permission, and the password grant requests the email scope so email_verified is available.

Fixes

  • OTR Ops Readiness: match OTR Customer Packet, Customer Contract, Washington/Oregon Moving Contract, Bill of Lading (FVP/RV/PVP) docTypes (!2268)
  • OTR Ops Readiness: visual inventory matching by artifact name when docType is null (!2268)
  • MCP OAuth: authorization_servers points to our backend instead of FA directly (FA doesn’t serve /.well-known/oauth-authorization-server) (!2268)
  • MCP OAuth: email fallback fetches from FA user API since introspection doesn’t return email_verified (!2268)
  • MCP OAuth: prefer role with mcp.access or wildcard . permission when selecting contextable role (!2268)
  • MCP OAuth: transient Neo4j identity-link failures are non-fatal (AuthenticationError still fatal) (!2268)
  • Auth: require email_verified from userinfo/id_token before email-based identity resolution (!2268)
  • Auth: password grant requests ‘openid email’ scope so userinfo returns email_verified (!2268)
  • Auth: use getFAErrorReason for safe error extraction in catch blocks (!2268)
  • Calculator: remove duplicated effects causing zone check failures (!2267)
  • Frontend: make OAuth redirect URI dynamic based on window.location.origin (!2268)

Other

  • Add ‘email’ to MCP OAuth scopes_supported metadata (!2268)
  • Add unit tests for pickRoleWithMcpAccess (wildcard ., zone_admin, karve, fallback, broken role) (!2268)

v2608.19.6 — August 19, 2026 [hotfix]

MRs: !2257

Fixes

  • Claude Desktop MCP install instructions now include the OAuth client ID — MoveRight doesn’t support automatic client registration (RFC 7591), so the client ID must be in the config (!2257)
  • MCP OAuth well-known endpoints now reachable via k8s ingress routing /.well-known/ to the backend (!2257)
  • MCP OAuth metadata points to proxy endpoints instead of FA directly, so Claude doesn’t need the client secret (!2257)
  • FA user linking: prefer admin/employee users over customer-only users when multiple Neo4j users share the same email (!2257)
  • Password validation: loosened to min 12 chars only, disabled validateOnLogin to stop forcing password changes on migrated users (!2257)
  • Crew navigator Start button now shows for confirmed events, not just booked (!2257)

v2608.19.1 — August 19, 2026 [hotfix]

MRs: !2257

Fixes

  • Crew navigator: lint fixes for CI pipeline (unused vars, max-len, prefer-const), collect payment step, capture storage, navigator improvements (!2257)

v2608.19.0 — August 19, 2026

MRs: !2257, !2253, !2265

Highlights

FusionAuth dual-auth migration (!2257) Move Right now runs on FusionAuth for authentication. Both auth paths coexist — old cached PWA versions keep using legacy Neo4j auth, new frontend versions use FusionAuth hosted login with branded Move Right login page, passwordless email/SMS, 2FA, WebAuthn passkeys, and a redesigned account page. User creation, password changes, invites, and password resets all sync to FA. 1880 users migrated from prod Neo4j with bcrypt passwords, 2FA secrets, and phone numbers. No cutover event or maintenance window required.

Crew navigator (!2257) Crew leads can now run a guided step-by-step navigator on their phone for each move. The navigator tracks step start/finish times, supports undo, persists crew notes, shows offline status, and displays live step timing on the workorders page. Ops and admins can edit step timings and update the navigator state from the desktop.

Customer profile merge (!2253) Duplicate customer accounts can now be merged directly from the customer page. The merge wizard shows similar customers, resolves conflicts for company names and billing addresses, and relinks all jobs, transactions, documents, notifications, and additional contacts to the surviving profile.

Aegis liability release matched to PandaDoc original (!2265) The liability release document template now matches the PandaDoc original’s signature layout and field placement.

Features

  • FusionAuth: branded hosted login, password grant, OAuth2 code exchange, wrapper JWT (ver:3), refresh tokens, context cache, webhook, forgot-password, passwordless email/SMS (!2257)
  • Account page: profile editing, password change, 2FA enrollment, WebAuthn passkeys, session management, avatar upload (!2257)
  • Quick invite dialog with role permission check (!2257)
  • People page redesign: Customers, Employees, Crew tabs with server-side role filtering and search persistence (!2257)
  • OTR Ops Readiness dashboard for ymm-interstate-usa zone with day-out thresholds and readiness indicators (!2263, included in v2608.18.0)
  • Crew navigator: standalone full-screen route, step persistence, timer, undo, notes, offline indicator, workorders live status (!2257)
  • Customer merge: similar customers search, merge conflict dialog, relink all related entities (!2253)

Performance

  • Neo4j user lookup by faUserId index (was 12s, now ~5ms) (!2257)
  • Email lookup uses BTREE index instead of fulltext scan (was 20s, now ~5ms) (!2257)
  • People page: zone filter on Role instead of User (9x dbHits reduction), removed total COUNT over 894K users (!2257)

Fixes

  • Archive queue CartesianProduct causing prod DB load (!2252)
  • AI comment function calls crash when function doesn’t exist (!2260)
  • Intake Yembo smart consult deferred to prevent blocking job creation (!2258)
  • Aegis YMM templates: one company-name standard, correct DBA naming (!2261, !2265)

Other

  • Aegis bumped to 0.1.24 (!2261)
  • Cloudflare Worker deployed for auth redirect (dev + prod) (!2257)
  • FA prod config: k8s configmap + secrets set, webhook configured, 1880 users migrated (!2257)
  • Functions version set to 2608.18.1 (template updates) (!2265)

v2608.18.0 — August 18, 2026

MRs: !2263, !2261, !2260, !2253

Highlights

OTR Ops Readiness dashboard for the interstate program (!2263) A new dashboard tab — visible only in the ymm-interstate-usa zone — tracks long-distance / over-the-road move readiness with a per-day checklist. Each item is due N days before the move (booking, 10, 7, 5, or 2 days out), and rows turn red when any overdue item is incomplete. Manual checkboxes (scope confirmed, rental reserved, hotels, driver DL, DOT medical, 1099/contracts, etc.) persist per job and sync across all events on the same job. Document signing status (customer packet, BOL origin, itinerary checklist, EOM checklist) is auto-resolved from Aegis artifact metadata.

Merge duplicate customer profiles (!2253) Users can now merge duplicate customer accounts directly from the customer page. The merge wizard shows similar customers, resolves conflicts for company names and billing addresses, and relinks all jobs, transactions, documents, notifications, and additional contacts to the surviving profile. Payment-method and auth-method conflicts are validated before the merge proceeds.

One company-name standard across all YMM document templates (!2261) The YMM moving contract, revision-to-estimate, liability release, and claims release templates now resolve business names the same way the PandaDoc originals did — no more fallback chains producing inconsistent franchise names on signed documents.

Features

  • OTR Ops Readiness dashboard with day-out thresholds, row highlighting, and readiness indicators (!2263)
  • Customer merge: relink jobs, transactions, documents, notifications, additional contacts, and billing addresses to surviving profile (!2253)
  • Similar customers search with NgRx state management on the customer page (!2253)
  • Merge conflict dialog for company name and billing address resolution (!2253)

Fixes

  • AI comment function calls no longer crash when the function doesn’t exist (!2260)
  • Aegis YMM templates: correct DBA naming and drop remaining fallback chains (!2261)

Other

  • Aegis bumped to 0.1.23 (company-name resolution standardisation) (!2261)
  • Functions version set to 2608.17.1 (template updates shipped via hotfix) (!2261)

v2608.17.0 — August 17, 2026

MRs: !2258, !2256

Highlights

Aegis gains full bill-of-lading coverage, multi-role signatures, and editable prefilled fields (!2256) The YMM bill of lading is now split into two dedicated doc types — Full Value Protection (FVP) and Released Value Plus (RVP) — each rendering as a signable Aegis document with prefilled estimate data that customers can edit inline. Templates support multiple signature placements per role (e.g. shipper and carrier both signing the same document), radio-button inputs, textareas, and inline field references. The moving contract template was reworked to land cleanly on four pages with signatures, and its release-of-liability sheet was split into its own template. Typography and column widths were tuned to match the PandaDoc originals.

Features

  • New ymm-bill-of-lading-released-value and ymm-bill-of-lading-value-protection Aegis doc types, replacing the single ymm-bill-of-lading template (!2256)
  • Templates can now declare multiple signature placements per role, each with a fixed footprint and page-break support (!2256)
  • New input types: radio buttons, textareas, and inline blank fields; a single input field can render in multiple places on the same document (!2256)
  • Bill of lading estimates now render as editable prefilled fields bound to job data (!2256)
  • --doc-type flag added to the template render harness for targeted testing (!2256)
  • Revision-to-estimate template captures the on-site form fields as editable inputs (!2256)

Fixes

  • Intake Yembo smart consult is now deferred so it doesn’t block job creation on the intake path; Yembo HTTP requests are bounded with a 30s timeout (!2258)
  • Terminal-mark detection is now atomic with the draft write, preventing placement marks from appearing on stale drafts (!2256)
  • Signature placements must come from a <signature> block — stray blocks no longer create phantom placements (!2256)
  • Signing overlay stays open when a stroke ends outside it, so customers don’t lose in-progress signatures (!2256)
  • Untouched prefilled fields are stamped at the document instant, not now, so they don’t drift on long sessions (!2256)
  • Moving contract typography and leading match the PandaDoc original; the contract lands on exactly four pages (!2256)

Other

  • Aegis bumped to 0.1.19 (multi-role signatures, page breaks, new input types) (!2256)
  • Aegis review tooling: template cards now line up across pages, every template is reported (matched or not), and one contract template serves both docTypes (!2256)
  • functions/version.txt set to 2608.14.1 (shipped with hotfix merge) — FVP/RVP templates and moving contract rework deployed to Cloudflare R2 (!2256)
  • Duplicate-template review tooling: PandaDoc templates are captured, scored, and clustered to confirm which Aegis templates can serve multiple docTypes (!2256)

v2608.14.0 — August 14, 2026

MRs: !2255, !2254, !2252, !2251, !2250, !2249, !2246, !2245

Highlights

Rule-triggered emails now go only to the roles the rule specifies (!2246) Previously, send-email-to-job rules were emailing every user on the job — customer, estimator, sales agent, and crew — regardless of the rule’s to field. Staff were receiving customer-facing emails (addressed to the customer), and unsubscribing, which also dropped their internal job notifications. Emails now respect the to recipients the rule names. This affected 452 rules across 27 zones, with 50–74% of daily rule-email volume going to staff addresses.

Charge values are now saved as whole cents, preventing job page load failures (!2245, closes #6647) Certain price/quantity combinations produced fractional-cent values (e.g. 100.00000000001) that violated the GraphQL integer schema, making jobs inaccessible and breaking job lists. Rounding is now applied consistently on charge creation, updates, and expense-total serialization, including a read-side fix for jobs saved before this change.

Performance

  • Archive job queue query rewritten to eliminate a CartesianProduct that caused 20M+ dbhits and 5+ minute queries in production — now ~140ms total across two split queries, with Bull stalledInterval raised to 10min to prevent duplicate execution across pods (!2252)

Features

  • Flat-price jobs can now select from different flat-price types, with calculator behaviour adapting to the chosen FP type (!2254, closes #6620)
  • Invoice numbers are now included on YMM invoices (!2255, closes #6666)
  • Snoball Zapier payload now includes customer zip code and sales rep name; estimator name is used as the sales rep (!2244)
  • mr scripts CLI commands added — list, inspect, create, update, run, delete, and view execution logs; script code limit raised to 250,000 characters (!2249)

Fixes

  • Script fetch() host function was failing with HTTP 0 Invalid IP address: undefined on Node.js 20+ — pinned DNS agent lookup callback now handles the { all: true } option (!2250)
  • QuickJS pending jobs were not pumped after async hook callbacks, causing await fetch() in hooks to silently never complete — runner now drains pending jobs before VM disposal (!2249)
  • Script zone matching now uses neoFilterObjectByZonesV2 (parents array) instead of the stale children array; tag service calls corrected to use the right service name and parameters (!2251)

Other

  • functions/version.txt set to 2608.14.0 to ship updated calculator scripts and Snoball payload changes to Cloudflare R2 via deploy-functions (!2254, !2244)

v2608.11.0 — August 11, 2026

MRs: !2244, !2241, !2238, !2236, !2235, !2233

Highlights

Snoball referral integration is live for the YMM-Toledo pilot (!2244) Completed moves now automatically post to Snoball’s Zapier webhook so Snoball can trigger referral outreach (SMS/email asking past customers to refer friends). When a Snoball-referred job is invoiced, a payout event is sent so Snoball can pay the referrer. Both flows are idempotent — a reserve-then-confirm tag pattern and a deterministic event ID prevent double-posts from concurrent or replayed executions. The webhook URL is configured per zone via snoball.webhookUrl (no hardcoded default).

Features

  • New S-One moving calculator with full quote generation, packing services, valuation options, and storage calculations (!2238)
  • S-One estimate template for Aegis document rendering (!2238)
  • Standard moving contract template for Aegis — a signable contract document for booked moves (!2236)
  • Weight and volume per item now displayed in the inventory standard template (!2233)

Fixes

  • Rule-triggered emails were sending to all roles on the job instead of only the roles named in the rule action — emails now go only to the specified recipients (!2241)
  • Charge calculations were producing broken floating-point numbers (e.g. 100.00000000001) due to missing rounding in create/update paths — rounding is now applied consistently across charge creation, updates, and expense-total calculations (!2235)

Other

  • functions/version.txt set to 2608.11.0 to ship the Snoball script, S-One calculator, and new templates to Cloudflare R2 via deploy-functions (!2244, !2238, !2236)

v2608.06.0 — August 6, 2026

MRs: !2234, !2235, !2231, !2227

Highlights

Aegis invoices no longer overlap signature fields when the charges table is long (!2234) Generating an invoice for a job with many events and charges produced a PDF where the charges table ran past the page edge and painted over the signature fields below it. The shared paginator now splits oversized tables at row boundaries, so a table that doesn’t fit on one sheet flows onto the next page instead of overflowing. The fix applies to all 7 Aegis invoice templates that have both a charges table and signature fields.

Fixes

  • Yembo inventory was not syncing to Move Right when yemboMoveCreatorId was missing (common for VOSE booked from intake at the moment the Yembo event arrives, before employees are assigned) — the early return is removed so artifacts upload with system as the author and inventory updates proceed regardless (!2235, closes #6628)
  • intake.virtualEstimators set to an empty [] was doing two contradictory jobs: the availability endpoint read it as “no filter → every estimator” while the intake form read it as “skip VOSE entirely,” so zones with no estimators configured still got virtual estimates booked against arbitrary Estimator assets — the layers now agree and VOSE is skipped when no estimators are configured (!2231, closes #6619)
  • Vancouver OBE leads were being misrouted to Lehigh Valley because area-code casing wasn’t normalized before the service-area lookup — area codes are now lower-cased, and address parsing for Canadian postal codes, US ZIP codes, highways, and civic numbers is improved (!2227, closes #6602, closes #6608)

Other

  • Aegis bumped to 0.1.18 (row-level table pagination in the shared paginator) — published via the hotfix merge (!2234)

v2608.05.0 — August 5, 2026

MRs: !2226, !2229, !2232

Highlights

MoveBuddha inventory documents now render in Aegis (!2226) Aegis can produce a branded, paginated inventory document from job data — itemized by room with job details, locations, totals, and free-text notes. Large rooms flow to continuation blocks so nothing overflows the page, empty inventories show a fallback message, and blank dates fall back to YYYY-MM-DD instead of printing a raw ISO string. The new inventory doc type resolves without a PandaDoc template ID, so franchises that never configured PandaDoc inventory can still generate one. A __name shim in the render harness lets esbuild-paginated PDF checks run in the browser without errors.

Intake form now supports late-mounted SPA containers (!2232) Sites that mount the MoveRight intake container after the script loads (e.g. single-page apps that render the form on navigation) previously got a silent no-op. The loader now exposes MoveRightIntake.init() for explicit initialization after late mounting while preserving automatic init on normal page loads, and calling init() repeatedly is safe — no duplicate forms. A standalone test page documents and verifies the late-mount/duplicate-prevention sequence.

Features

  • New system report 3001.5 Calendar Events With Sales Agent and Estimator — a variation of 3001.4 that adds an Estimator column next to Sales Agent, using the same estimator-resolution logic and the same filters/period/aggregations (!2229)
  • inventory Aegis document type with zone-configurable activation, metadata, validation, and accent colors; the documents modal keys template lookups on the config key so Aegis-only doc types resolve without a PandaDoc templateId (!2226)
  • MoveRightIntake.init() browser global for explicit intake initialization after late mounting, with repeatable/duplicate-safe invocation (!2232)

Fixes

  • documents-modal template lookup keyed on templateId failed to resolve Aegis-only doc types (no PandaDoc template) — now keyed on the config key (!2226)
  • Aegis documents printed a raw ISO string when a date field was blank; blank dates now fall back to YYYY-MM-DD (!2226)
  • esbuild’s __name helper threw in the browser-rendered PDF pagination harness; a shim restores it so serialized pagination runs cleanly (!2226)
  • 3001.5’s Event Type Summary aggregation keyed on a non-existent createdAt, producing an empty summary; corrected to eventCreatedAt so buckets populate (!2229)
  • Inventory document dropped the internal-use line and consolidated the customer name rendering (!2226)

Other

  • Aegis bumped to 0.1.17 (new inventory template + render-harness __name shim) (!2226)
  • Intake bumped to 2608.05.0 (SPA init() support, test page, vite config for the MoveRightIntake global) (!2232)
  • functions/version.txt set to 2608.05.0 to ship the inventory template to Cloudflare R2 via deploy-functions (!2226)
  • hotfix: deploy functions 2607.31 to R2 (!2225) shipped the prior release’s R2 functions after the 2607.31.0 release commit skipped functions/version.txt; superseded by this release’s functions bump