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.28.0 — August 28, 2026

MRs: !2292, !2293, !2294, !2295, !2296, !2297, !2299, !2300

Highlights

Sidebar redesign with header-based zone resolution and multi-role permissions (!2292) The navigation sidebar is rebuilt as a collapsible rail — collapsed to 62px with a vertical “MOVE WITH MIGHT” wordmark and sticky footer, or expanded to 230px with inline-SVG logo text (no font flash), a live clock with IANA timezone tooltip, and release-notes access from the version badge. Zone resolution moves to a per-request x-zone header with additive multi-role permissions resolved across the full zone ancestry, so users no longer pick a role when switching zones. Area zones work directly without ancestor rewriting, and job-page zone changes redirect to the jobs list instead of being disabled.

YMM on-site estimate and bills of lading ported and redesigned in Aegis (!2297, !2296) The one-page Work Order (Bill of Lading) an estimator fills in at the customer’s door is now an Aegis template, with PandaDoc remaining the default until zones opt in. The three interstate bills of lading (released value, full value, and platinum) were audited field-by-field against their PandaDoc originals — fixing a PVP declared-shipment-value bug that understated coverage by half, restoring total weight and six dropped recipient fields, and rebuilding the layout on Sarika Kumra’s reference PDFs.

Screen pop and escalate-email links now open the correct zone (!2299, closes #6780, #6779) Multi-zone users (e.g. NSC agents with roles in several franchises) who opened a job from a screen-pop or escalate-email link were recontexted to their first zone alphabetically and got a “Cannot find job in any zone” error. The frontend now passes the URL ?zone= param through to authentication, job URLs carry the franchise zone directly, and all notification templates include the zone in their job links.

Performance

  • Auth context is now cached in Redis under a zone-only key when no role is sent, eliminating four Neo4j calls per request on the hot path — the cache is invalidated on role assignment/removal with a 10-minute TTL (!2294)

Features

  • Collapsed sidebar rail with SVG logo, sticky footer, live clock, and version-badge release-notes link (!2292)
  • Zone switcher shows zone only (no role) and filters area zones server-side (!2292)
  • YMM on-site estimate ported to Aegis with opt-in engine/templateUrl config fields — PandaDoc stays the default (!2297)
  • Three YMM bills of lading redesigned on reference PDFs with fidelity fixes against their PandaDoc originals (!2296)

Fixes

  • Multi-zone users opening a job from a screen-pop or escalate email now land in the job’s franchise zone instead of their first alphabetical zone (!2299, closes #6780, #6779)
  • Jobs can be moved to another area because area zones remain available in the move query (!2300)
  • Job totals now recalculate after adding charges via the run_calculator AI function, so instant-estimate documents show matching numbers (!2295)
  • MCP view_events no longer throws “(intermediate value) is not iterable” — the MCP guard always returns the permissions array (!2293)
  • MCP view_day_schedule / day_summary now apply zone filters so cross-franchise data is no longer returned (!2293)
  • MCP refresh-token TTL patched to one year for long-lived Claude sessions (!2293)
  • PVP bill of lading declared shipment value now uses ×12 multiplier (was ×6), and weight fields carry the job inventory total (!2296)

Other

  • FusionAuth branding and OAuth settings synchronized during gateway startup; deployment script and operating guidance added (!2293)
  • Functions version bumped to deploy YMM on-site estimate and bill-of-lading templates (!2297, !2296)

v2608.27.0 — August 27, 2026

MRs: !2291, !2290, !2288, !2284

Highlights

OTR Direct revenue tracking and calculator overhaul (!2291, !2290, closes #6765, #6751, #6655) OTR-Operated jobs now retain franchise payout and use Partner FP calculations. Third-Party jobs support negotiated amounts, correct agency payouts, and safer OTR fee handling. Revenue reports separate OTR Direct, Interstate, and Partner FP-not-shared components, and labor reports include booked and invoiced OTR jobs with shared-franchise breakdowns, missing-labor diagnostics, clipboard copying, and expanded CSV export. The OTR calculator now includes additionalDriveTime in real unload hours.

Sixteen PandaDoc template families ported to Aegis (!2288, closes #6690) Post-load walkthrough, additional valuation, move and pack acknowledgement agreements, OTR customer packet, damage report, walkthrough acknowledgement, Relentless customer satisfaction release, Oregon moving contract, Vancouver Island ministry estimate, Portland confirmation email, Interstate agency move, Lehigh Valley release of liability, Denver protection plan, Charlotte two-signature estimate, and Charlotte customer contract. The OTR packet gains in-document promo placement, and the estimate family fixes a long-inventory overflow that pushed charges onto the next page.

Features

  • OTR Labor Tracking dashboard adds zebra striping, pay-period copy-to-clipboard, booked-only job stage filter, and a “Shared with Franchises” column (!2290, closes #6655)
  • OTR System Revenue dashboard hides the internal test franchise (Toledo) and bumps the calculator version (!2290)
  • Promo artwork can now be placed at any point inside an Aegis document, not just appended at the end (!2288)
  • Dev-only tooling: clone a production job into the local backend and re-render a reported document from its own embedded PDF context (!2288)

Fixes

  • Book-off events now retain drag, reschedule, and duration changes after saving schedule edits — events update without a page reload (!2284)
  • Availability data refreshes after a successful book-off bulk edit, and events without an associated job are included (!2284)
  • Long estimate inventory listings no longer overflow onto the next page — rooms are chunked into page-sized blocks across the whole estimate family (!2288, closes #6690)
  • Aegis document send buttons now show the zone’s configured document name instead of the raw docType key (!2288)
  • Lehigh Valley release acknowledgment fields corrected (!2288)
  • YMM walkthrough acknowledgement detail layout improved (!2288)

Other

  • Aegis promo-page machinery extended with ingestion, rendering, manifest, attachment, and regeneration handling (!2288)
  • New date-time-input component shared across book-off and event editors (!2284)
  • OTR System Revenue dashboard backend snapshot tests added (!2291)
  • Functions version bumped to deploy YMM template and OTR calculator changes (!2288, !2290, !2291)

v2608.26.0 — August 26, 2026

MRs: !2289, !2287, !2286, !2285, !2283, !2282, !2281, !2279, !2278, !2276, !2275, !2274, !2273, !2272, !2271, !2270, !2269, !2268, !2267, !2266, !2265, !2264, !2263, !2262, !2261, !2260, !2259, !2258, !2257

Highlights

BlueSagePay payments integration (!2262, !2264) MoveRight can now take payments through BlueSagePay — by pay link sent to the customer over SMS/email, or in person on a card terminal (sale, authorization, completion, and cancel). Terminal payments that arrive without a matching request are auto-reconciled to their job or queued on a new “Unmatched payments” review screen for manual attribution. A Payments panel under Settings → Business → Settings connects each franchise to BlueSagePay and detects a payment type that would break refunds before it does.

Aegis document generation goes live in the crew navigator (!2277) The crew navigator now uses AEGIS for document generation instead of pre-generating contracts. The old pre-generation flow and its UI controls have been removed, and AEGIS supports employee-first then customer-second signing.

FusionAuth authentication migration shipped (!2257, !2271, !2273, !2268) MoveRight now authenticates through FusionAuth with MFA, password recovery, passkeys, sessions, and account management. Legacy auth is preserved through provider selection. Users are migrated with bcrypt password hashes, phone login, duplicate handling, and synchronized through signed webhooks. Zone-aware permissions with wildcard matching and restrictions replace the old model. Area zones are no longer selectable as auth context — fixing the empty-dashboard bug some users hit after login.

Five new YMM estimate variants ported to Aegis (!2281) Aegis now has estimate templates for Calgary, Vancouver, Charlotte, Interstate USA, and Kitchener-Waterloo, preserving franchise-specific branding, pricing, tax, inventory, terms, signer roles, customer guidance, and promotional content.

Features

  • OTR Ops Readiness dashboard for the ymm-interstate-usa zone — per-day readiness checklist with auto-resolved columns and day-out thresholds (!2263)
  • Apex calculator with custom estimates and programmatic document generation (!2276)
  • Aegis Release of Liability template pair with optional model-number support and editable, role-scoped claim-release fields (!2269)
  • Custom YMM Aegis templates — estimates, invoices, reminders, moving checklist, valuation, walkthroughs, and liability release (!2275)
  • Single-unit Aegis templates for client-specific estimates, invoices, reminders, waivers, and timesheets (!2259)
  • Standardized company-name display across YMM Aegis documents — legalName DBA: businessName (!2261)
  • MCP OAuth, profiles, scope checks, and operational tools (!2257, !2272)
  • People views redesigned for customers, employees, and crew (!2257)

Fixes

  • MCP now requires zoneId per zone-scoped tool call and combines permissions across all applicable roles in the selected zone; switch_zone removed (!2289)
  • Aegis templates restored to match their PandaDoc references across six YMM templates — wording, clauses, signatures, labels, footers (!2287)
  • Promo asset 404s in production fixed — root-absolute /functions/ prefix resolved in both local and production (!2286)
  • Workorder event time no longer wrong when job opened from screen-pop link — timezone fix (!2285, closes #6740)
  • Timeline range selection extended to 90 days and across month boundaries (!2283, closes #6419)
  • Inbound email reply parsing no longer drops content when SendGrid sends no text/plain part — falls back to HTML (!2282)
  • YMM Vancouver Island estimate matched to PandaDoc original — layout, wording, non-signable, GST omitted (!2278, !2270)
  • Charge reordering identifies the moved charge by chargeId so positions don’t break (!2274)
  • refundTransaction now works for all payment types including Square (K20); refund no longer routed as a new charge (K23) (!2262)
  • AI execution no longer crashes when the model requests an unavailable function — records an explicit missing-function error (!2260, closes #6634)
  • Yembo Smart Consult no longer blocks the intake response — 30s timeout, deferred execution (!2258)
  • Calculator failing-zone check and duplicated effects cleaned up (!2267)
  • User page no longer goes blank after being opened the first time (!2266)
  • Aegis liability release signature layout matched to PandaDoc (!2265)
  • Transactions can now be added to jobs in area zones — context resolution falls back to nearest non-area ancestor (!2279)
  • BlueSage auto-attach could never file a sale and lost the ones it couldn’t — fixed, plus terminal timeout-on-refund, preauth-as-hold, tip recording, and review-queue drops (!2262)
  • Login permission enforced — users without auth.login get NO_LOGIN_PERMISSION; unauthorized caller-supplied roles ignored (!2271)

Performance

  • BlueSagePay terminal push orchestration with GraphQL surface (!2262)
  • A payment confirmed by webhook now updates an open job in real time (!2262)
  • Intake latency reduced — Yembo Smart Consult no longer blocks the intake response (!2258)

Other

  • OTR Ops Readiness docType matching recognizes supported document variants (!2268)
  • Fresh developer checkouts can use the shared FusionAuth instance without local services, .env, or API key (!2268)
  • OAuth callbacks use the configured frontend URL; email resolved from /oauth2/userinfo with id_token fallback (!2268)
  • Reporter users now have mcp.access and mcp.report (!2272)
  • Diagnostic logging and raw-email artifact capture for inbound parse edge cases (!2282)
  • Functions version bumped to deploy YMM template fixes (!2286, !2287)

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