DeGroot CRM Changelog
What changed in our systems and when. Grey "log" lines are the raw technical history; the rest are written for the team. Updated automatically (last build 09 Sep 2026).
1023 changes shipped in the last 30 days (213,220 lines of code added, 50,452 lines of code removed), 2344 in the last 90, across 5 systems.
Week of 07 September 2026 412 changes
- Positive inbound SMS replies now create follow-up tasks for the current Opp owner, with Bailey used only when no owner is available. The success notification is sent only after the task is confirmed. In the CRM tasks and notifications created from inbound SMS replies.
- The quoting tool can now show locally stored roof images alongside fetched imagery, and those images can be linked or exported. In the quoting tool image browser.
- The job economics card now shows margin and variance details, matches heat-related lines to the correct roof, ignores zero-quantity audit lines, and keeps provisional figures neutral. On the job economics card for an Opp.
- Lead-paint replacement handling now resets draft operational details safely and checks retained billing against verified Books and Xero credits or refunds before proceeding. When using the lead-paint replacement actions on an Opp.
- The CRM now preserves product rows during height-safety recalculation and applies the correct NuTech Silver topcoat scope, including normalised product exclusions. In Opp products and the generated roof scope.
- Taxable invoice lines are now classified consistently in Books, and referral discounts are retained when only some roofs are accepted. In CRM pricing recalculation and the resulting Books invoice.
- Weekly progress billing now handles held catch-up work, credit notes are mirrored and attributed correctly, deleted Xero payments are ignored, and matching legacy progress invoices are no longer repeatedly flagged for review. In the CRM billing workflow, Books, and Xero synchronisation results.
- The customer maintenance request form now checks address completeness earlier, before the request continues. On the customer maintenance request form.
- Roof Painting job checklists now refresh older templates to the current version so revised wording and rows can appear on new jobs. In the FSM checklist generated for a Roof Painting job.
- Daily job digests now go to the relevant Operations Manager, with Bailey copied, and missing-hours items also reach the manager for the affected placeholder Opp. The reports provide clearer region and unresolved-technician warnings. In the daily job-hours and missing-hours email digests.
- The CRM now provides a Weekly Billing Queue with Send, Fix, and FYI actions, plus a billing tab to review rows, send held drafts, dismiss checks, refresh a deal, or rerun the billing calculation. In the CRM Weekly Billing tab and the Weekly Billing Queue records.
- New FSM Clients now receive the valid phone and mobile details from the CRM, and the daily check flags open jobs whose Client record has no phone number. In the FSM Client record and the daily phone-format check.
- Invoices now keep their Opp link when the customer changes, and invoice recipients follow the same account and contact policy used by deposit invoices, with a visible task when routing is blocked. In CRM invoice records and the related Books invoice.
- Books invoices now keep a durable CRM Opp link, so invoices that lose their normal link can still be found and reattached automatically. In the CRM Opp's invoice area and the linked invoice in Books.
- When a Client has a landline but no mobile number, the CRM now copies the phone number into Mobile so the crew can see it on active jobs. On the Client record and Active Jobs card.
- If a Books customer has no email address, the invoice sync now fills it from the invoice's To address, while leaving existing account routing unchanged. In the customer and invoice records in Books.
- Sending a GP quote now uses the person who clicked the button, and replacing an existing quote uses the new Replace GP Quote button after confirmation. On the Opp's GP quote actions.
- SafetyCulture audits now read the live Technicians Observed answers correctly, can score without a resolved job number, and show clearer follow-up information for audits needing review. In the technician scorecard and manager job-hours digest.
- Account Total Sales is now calculated from sold Opp amounts and is also visible on the Commercial Accounts layout. On Account records in the Account Information section.
- Roof scope text now names the paint system selected by the quoting calculation and removes duplicate topcoat sentences. In generated roof scopes and customer proposals.
- Force Amount is now treated as the final customer total, so the lead-paint compliance fee is not added twice. On the Opp pricing fields and customer proposal totals.
- Lead-paint proposals now retain the roof substrate, show eligible re-screw work, and cannot move an already accepted Opp backwards when an old proposal link is submitted. In the customer proposal and the related CRM Opp.
- Customer proposals now use one consistent customer total and calculate gutter add-ons from the billed Opp product line. In the customer proposal total and selected gutter add-ons.
- Technicians can use We text it for you to send a referral invitation after entering the customer's name and mobile. The form now reports whether the text was sent, blocked as a duplicate, or could not be completed, while the office can review the send result separately. In the FSM technician referral page and the Referral Invites report.
- The job-hours scorecard now shows provisional rankings before the days target is reached, while still making clear that the prize requires the worked days. Safety audits can also show suggested or confirmed crew attribution, with the watchdog giving the next action for unresolved audits. On the job-hours scorecard and its SafetyCulture audit watchdog notices.
- Books invoice creation now uses the Operations Manager as the salesperson when available, and falls back to the Opp Owner when needed. Commercial progress invoices are included, and repair notes now describe the resolved address without assuming which role supplied it. In CRM invoice processing and the related Books salesperson repair notes.
- Customer proposals now prevent repeat acceptance of the same proposal, and the accepted proposal summary has been adjusted to fit smaller screens. On the customer proposal acceptance page and its acceptance summary.
- Technicians can now change a checklist task's Status from Task Details, and the task view shows the number of photos with a View photos link instead of loading every image immediately. Checklist task identities are also kept stable when wording changes, so existing tasks remain matched correctly. In the FSM technician checklist task view and Task Details form.
- The weekly billing panel now shows the original billing sources and Haymes inclusion decisions, with multiline review responses displayed correctly. Use the panel to understand why each billing line was included before approving it. In the CRM Weekly Billing panel.
- Phone leads marked as general painting in the roof condition field are now routed to the general painting owner, even when the service category still shows roof painting. In the CRM Lead record and owner assignment.
- Referral invoice monitor emails now group findings by Opp, making it clearer which billing records need attention. The checks are read-only and do not change invoices. In the referral invoice monitor emails and the related Opp billing records.
- In Weekly Billing, you can now compare CRM labour entries with BrightHR Blip clockings, review the billing source beside attributed labour, and see clearer guidance when totals match. Clock-ins are evidence for the review and do not replace the attributed hours. Open the Weekly Billing review panel in the CRM.
- Touch-up jobs can now continue through the deposit check when the required earlier job information is missing but the latest completed transition supports recovery. Staff should no longer need to work around this blocked touch-up workflow. This is visible when creating or updating touch-up jobs from an Opp.
- The technician scorecard now explains callback exclusions with the related Opportunity name and date, and keeps the callback explanation within the label so it is easier to read. Open the callback details in the technician scorecard or job-hours report.
- In the quoting tool's image browser, you can now keep images in the local library, link them to records, and export them for the next step in the imagery workflow. Open the image browser and use the local library and export controls.
- Leave coverage now selects jobs based on the covered person's existing Operations Manager assignments, rather than applying coverage broadly by geography. Review leave coverage assignments in the CRM scheduling area.
- You'll now see clearer explanations for the Job Economics figures, including margin, variance, costs, and the labour breakdown. Use the expanded card when reviewing job performance. Open the Job Economics card on the relevant Opp.
- When you reopen a saved property in the quoting tool, manually added roof edge tags and Street View framing are retained instead of being cleared. You can continue measuring from the saved view without reapplying those details. In the quoting tool, open a saved property and review its roof measurements and Street View view.
- When you quote a Tin Tile Average roof, the quoting tool now prices it as a tin-tile roof, matching the CRM. The pricing comparison also identifies unresolved condition or base-price entries instead of silently treating them as a standard factor. In the quoting tool, select the roof condition and review the calculated paint and repair pricing.
- The quoting tool now requires archived roof imagery to have a stored property identity before reusing it. If the ownership is unclear, the system will fetch the imagery again rather than showing imagery from the wrong property. In the quoting tool, when archived imagery is loaded for a property.
- When you delete a manual roof in the quoting tool, any unfinished analysis for that roof is now cleared so it cannot be applied to the remaining roofs. In the quoting tool, on the roof cards and roof measurement workspace.
- Approved quote handoffs now keep the confirmed customer imagery with the quote, and can be resumed when a handoff needs another attempt. Check the quote imagery before completing the handoff. In the quoting tool, review the property imagery and quote handoff status before sending the quote to the CRM.
- [sms] route positive replies to deal ownerlog
- [audit] add staff routing scannerlog
- [audit] enforce routing role contractlog
- [audit] ratchet staff routing consistencylog
- [audit] close routing ratchet review gapslog
- [fsm-image-browser] local image library with link + exportlog
- [job-economics-card] margin breakdown + variance displaylog
- [audit] per-deal recheck mode for deposit invoice gate auditlog
- [audit] fail the targeted recheck when --deal-id matches no Deallog
- [job-economics-card] per-roof heat matching, ignore zero-qty audit lineslog
- [fsm] harden lead paint clone billinglog
- [pricing] preserve Opp_Products row ids on HSF synclog
- [scope] replace Acryloc topcoat for NuTech Silverlog
- [invoicing] pin GST on taxable Books lineslog
- [scope] normalize product IDs before exclusionslog
- [scorecard] observe callbacks without timeline eventslog
- [automation] refresh fixed-price job economicslog
- [job-hours] enable nightly economics recomputelog
- [widget] keep provisional economics neutrallog
- [invoicing] repair Monday progress billing runlog
- [jobhours] serialize CRM token refreshlog
- [job-hours] add advanced missing-hours reviewlog
- [job-hours] use current Streamlit dataframe widthlog
- [finance] mirror Xero credit notes into Bookslog
- [finance] pass credit note numbering flag in querylog
- [finance] attribute Xero credit note mirrorslog
- [pricing] exempt referral discount from not-accepted-roof zeroinglog
- [portal] early address-completeness gate on MR formlog
- [area-pack] canonical roof_enquiries_v1 metric + evidence contractlog
- [briefing] client-portal MR failure + blank-street checkslog
- [fsm] version-gated V3 reseed of the tile checklist templatelog
- [scorecard] exclude contractors from roster; flag invalid SafetyCulture inspectionslog
- [job-hours] route the daily job digest per Operations Managerlog
- [job-hours] name the fix on unresolved-technician nagslog
- [job-hours] nightly FY-window sweep for old unresolved crew tokenslog
- [area-pack] Google sign-in via tinyauth, basicauth kept for scriptslog
- [job-hours] source runtime.env in the VPS wrapper so hand runs match the servicelog
- [daily-notes] file checklist rows by job address when the actor is not a field techlog
- [area-pack] forwardAuth via loopback port, host-mode traefik has no docker DNSlog
- [daily-notes] flag deal-routed digest items that carry no VIC/TAS regionlog
- [xero-sync] skip DELETED Xero payments when replaying into Bookslog
- [daily-notes] recover a digest region from the deal before calling it unidentifiedlog
- [invoicing] legacy money-matched progress invoices count as coveredlog
- [invoicing] Monday run auto-drafts held catch-up invoices behind a floorlog
- [invoicing] Weekly Billing Queue rows and a Send/Fix/FYI digestlog
- [job-hours] missing-hours queue also goes to each placeholder deal's Operations Managerlog
- [invoicing] delete stale queue rows via the CRM REST APIlog
- [invoicing] guard every left() in the row builderlog
- [invoicing] one FYI row per legacy deal, current-week jobs are not catch-up failureslog
- [invoicing] compare work dates as dates in the current-week checklog
- [area-pack] opportunity flow per review fortnight, three-chapter pageslog
- [invoicing] Weekly Billing web tab with Send, Dismiss, Refresh, Re-runlog
- [invoicing] weekly billing panel reads rows by COQL id, not searchlog
- [area-pack] one review-fortnight select drives the daily charts and the flowlog
- [area-pack] marketing charts, prospects per day and spend by month against budgetlog
- [fsm] create FSM Client with the E.164 phone and mobilelog
- [fsm] daily canary flags phone-less Clients on open jobslog
- [invoicing] sync deal invoices under the deposit path's identity policylog
- [invoicing] keep the final draft on its deal when the customer changeslog
- [invoicing] stamp every Books invoice with its CRM deal and re-attach by itlog
- [fsm] Client on-validate rule fills Mobile from Phone for landline-only contactslog
- [invoicing] fill a blank Books customer email under account routinglog
- [invoicing] never create an unlinked Books contact person for a CRM contactlog
- [crm-digest] resolve siblings by package, never by bare module namelog
- [scripts] zoho_bulk helpers and a credit-safe shadow-lead converterlog
- [resync] refuse to write function_registry.json from a --only/--limit subsetlog
- [gp-sign] function-backed Send and Replace buttons so the sender runs as the clickerlog
- [crm] bulk_write_mode kill switch for the Contact/Account workflow cascadelog
- [briefing] CRM API credit gaugelog
- [scripts] api_credit_preflight prices a bulk CRM job before it runslog
- [crm] suppress triggers on the international phone write-back toolog
- [crm] close four more Contact/Lead workflow write-back leakslog
- [area-pack] show the open pipeline split by stage on every area pagelog
- [scorecard] find unattributable SafetyCulture audits and tell their authorlog
- [hooks] stop the pre-commit git environment leaking into the staged-tree pytestlog
- [tests] stop the MR email audit test operating on the real repositorylog
- [watchdog] Mac delivery watcher checks the bundle marker, not the retired digest keylog
- [job-hours] Missing hours queue goes to Bailey onlylog
- [scope] one topcoat sentence per roof, named by the paint we buylog
- [fsm] stop FSM-missing alerts on pending lead-paint replacementslog
- [area-pack] a marketing dollar sits in the month the ad ranlog
- [area-pack] marketing spend runs to today, not to yesterday in Californialog
- [pricing] Force_Amount is the final total, not a fee-exclusive baselog
- [area-pack] the VPS builds and publishes the pack dailylog
- [pricing] keep the substrate when lead paint takes over Conditionlog
- [proposal] show re-screw on lead-paint quotes, and stop acceptance rewinding the stagelog
- [scorecard] read Technicians Observed from the holder SafetyCulture sendslog
- [scorecard] attribution audit dates in Melbourne and reads for approvallog
- [scope] Kliplok Good names the topcoat the engine actually buyslog
- [vps] the area pack deploys from a commit, not from a working treelog
- [vps] the mid-build deploy guard never firedlog
- [creator] repair the CustomerProposal mirror and detect mirror driftlog
- [scorecard] flag the 4 Sep demonstration audits so they can be undonelog
- [proposal] ship the 2026-08-08 pricing fixes, distributed not groupedlog
- [drift] stop counting undeployable doc headers as repo-ahead driftlog
- [drift] ignore comment lines on both sides, not just the repo headerlog
- [scorecard] rank the board before anyone has the days minimumlog
- [referral] office texts the invite, and the send result is office onlylog
- [scorecard] the audit panel opens under the cell you hoveredlog
- [drift] weekly alert for repo-versus-live deploy driftlog
- [referral] turn the customer invite text onlog
- [drift] log why the deploy-drift check crashed, not just that it didlog
- [pay] adopt live WorkOrderPriceUpdate, which excludes the compliance feelog
- [drift] tell an empty sweep apart from a changed output formatlog
- [briefing] flag deals at/past Job Created with no FSM joblog
- [books] resolve the salesperson from the Operations Manager, falling back to Ownerlog
- [audit] catch an opportunity left behind its own signed acceptancelog
- [books] the salesperson sync note stops naming a role it cannot knowlog
- [referral] dedupe before the text, and tell the technician what actually went wronglog
- [lead-paint] stop the FSM transfer failure reporter from throwinglog
- [area-pack] opportunities to add, where the FY lands, and one Quote Sent stagelog
- [gemini] read the API key from the org variable, not a hardcoded literallog
- [books] stamp the salesperson on commercial progress invoiceslog
- [job-description] strip markdown headers out of the LLM Exclusions blocklog
- [address] read the Google key from the googleAPIKey org variablelog
- [fsm] read the Gemini key from CRM, removing the last hardcoded copylog
- [roof-care] gate canaries on a synthetic Deal name, retire the standing test Deallog
- [drift] stop comparing handleCustomerEmailFailure1 against the wrong live functionlog
- [watchdog] make the 07:00 breach email a to-do listlog
- [scorecard] suggest the crew for an unscored audit from that day's labourlog
- [haymes] stop the matcher failure reporters from throwinglog
- [referrals] stop processReferralBacklog dying on its own failureslog
- [job-economics] guard the blank Work_Date read and the error reporterlog
- [progress-invoice] a blank date no longer empties the draftlog
- [scorecard] attribute a legacy-form audit with one VPS commandlog
- [area-pack] the follow-up row says Quote Sent, matching what it now countslog
- [scorecard] score legacy-form audits from labour, signed 2026-09-05log
- [scorecard] attribution_source column reaches a legacy DBlog
- [functions] functions_py/ home for Python and Node CRM functions; resync checks them against the deployed copylog
- [haymes] Python 3.12 rollup backstop, dry-run verified against the Deluge filter (ADR 0095)log
- [fsm] mirror pulls three live-only handlers; ADR 0095 records the backstop cut-overlog
- [fsm-checklist] make the Portal Job Checklist ZML schema-validlog
- [fsm-checklist] task view counts photos and opens them in the native formlog
- [fsm-checklist] "View photos" loads the originals on request instead of the native formlog
- [drift] CRM function drift is a daily briefing check read from Functions__s, compared against origin/mainlog
- [fsm-checklist] "View photos" opens the trimmed Job_Checklist detail viewlog
- [fsm-checklist] "View photos" link needs an absolute URLlog
- [fsm-checklist] technicians can change a task's Status from the Task Details formlog
- [area-pack] one budget denominator for marketing spendlog
- [area-pack] expected from open quotes, each weighted by its agelog
- [delivery] a Stop hook refuses to end a session that left work undeliveredlog
- [delivery] the Stop gate stops claiming attribution git cannot give itlog
- [crm-digest] the changelog site publishes at prepare, emails still wait for approvallog
- [delivery] the Stop gate covers Codex toolog
- [session-start] push work out of the one checkout agents sharelog
- [lead-routing] read Roof_Condition when deciding general paintinglog
- [jobhours] recover nightly auth and report all close blockerslog
- prevent repeat customer proposal acceptancelog
- [delivery] persist obligations through PR merge and live readbacklog
- [delivery] preserve recovery actions in pending statuslog
- fit accepted proposal summary to mobile screenslog
- [delivery] bind source files and scope Stop obligationslog
- preserve Haymes manual assignments and surface unbilled materialslog
- reject concurrent changes during Haymes manual linkinglog
- [fsm] allow missing touch-up jobs past deposit gatelog
- carry optional visual evidence into the changeloglog
- [fsm] require latest completed transition for touch-up recoverylog
- attach follow-up evidence to published changelog entrieslog
- preserve follow-up evidence when releasing a pending batchlog
- [billing] mute Blip mismatch on mixed open dayslog
- [job-economics-card] explain costs and preserve labour breakdownlog
- [Quoting Tool - ui] carry edge tags through cold session loadlog
- [Quoting Tool - pricing] report a condition no paint table knows, and omit the field on clean runslog
- [Quoting Tool - property-library] keep the folded read and claim paths exactly as narrow as beforelog
- [Quoting Tool - raster] keep the serve module silent and inside the write-seam guardlog
- [Quoting Tool - condition] type the exported tile collector and keep the adjudicator guardlog
- [Quoting Tool - raster] type the coverage bbox honestly and pin the synchronous invalidationlog
- [Quoting Tool - pricing] price Tin Tile Average as a tin-tile roof, as CRM doeslog
- [Quoting Tool - ai-archive] require a stored identity before serving an archived clip (#661)log
- [Quoting Tool - ui] drop in-flight analysis token when deleting a manual rooflog
- [Quoting Tool - review] drop the orphaned MCP Street View tool and keep TC/out out of Docker buildslog
- [Quoting Tool - deploy] pin VPS smoke TCP to the Tailscale hostlog
- [Quoting Tool] stop after recovering a reusable transaction tokenlog
- [Quoting Tool] retry rejected handoffs and store saved media oncelog
- [Quoting Tool - ui] add commercial execution reuse pathlog
- [Quoting Tool - ui] close commercial import review and fallow findingslog
- [PayrollPilot - payroll] preserve local weekly dateslog
- [PayrollPilot - react] move date helper out of component modulelog
- [PayrollPilot - payroll] remove rejected upload fileslog
- [PayrollPilot - payroll] validate employee rows before Sheet synclog
- Changelog updates can now include screenshots and verification notes. Expand Verification below an update. Select an image to open it full size.
Verification
Local changelog preview checked at 1440×900 and 390×844 using fictional data. Images loaded without horizontal overflow; keyboard disclosure and the full-size image link passed. HTTP readback matched the published image SHA-256. Tested code: d3c413d2cab172b3d90ac7fe9925ce440a1603ce. Production rollout and signed-in PR image rendering remain unverified. Source revision: 9cede5811f0a1e2df6afd5ccf55e35609bf01742.

Desktop changelog detail with verification notes and a fictional tooltip screenshot. 
Changelog evidence at 390px wide, with keyboard focus on the disclosure. - The Monday billing process now puts each item into Send, Fix, or FYI sections, with clearer actions and a new screen for sending held invoices, dismissing checks, refreshing rows, and rerunning one Opp. Use the queue to see what needs action instead of relying on the old classification names. Open the Weekly Billing web tab in the CRM.
- The CRM now keeps invoices linked to the correct Opp when a customer or Account changes, and uses the approved invoice recipient details more consistently. A blocked cross-Account contact is now flagged for review instead of silently creating or updating the wrong Books contact. Review the invoice and customer details from the Opp's invoice area and in Zoho Books.
- Technicians will now see valid client phone numbers carried into FSM more consistently, including a mobile fallback for landline-only contacts. Existing open jobs with missing phone details are also flagged for follow-up. Check the Client details and contact card on an FSM job.
- The DeGroot Settings screen now lets authorised staff choose the Operations Manager for each route and set leave cover dates. The selected manager also receives the 6am digest for that region, and cover applies to new jobs created during the cover window. Open the DeGroot Settings web tab in the CRM.
- Roof scope paragraphs now show the price for fascia, rafter, downpipe, and other trim work, including the correct combined price where both height bands apply. The downpipe height wording has also been corrected. Review the generated scope and pricing paragraphs in the quoting tool and customer proposal.
- Pre-work form answers are now recorded as a technician note before the job stage advances, so the CRM will not show the form as completed unless the crew-visible answers have been saved. Open the Opp's Job Notes and Work Log area.
- Maintenance request forms now check the address earlier, so incomplete addresses are identified before the request can continue. In the client portal maintenance request form.
- Amanda, eligible declined roof quote Opps are now marked for your in-CRM review before the Heat Reflective offer outreach. Use the HR Offer Outreach tag to identify the review group. On the relevant Opp records in the CRM.
- When sending or replacing a GP quote, use the separate Replace GP Quote button when the CRM asks for confirmation. The buttons now run as the person who clicks them, so authorised staff are no longer incorrectly refused. On the Opp, in the GP quote signature buttons.
- ServiceTasker accepted leads are now added to the CRM with their enquiry details, and repeat enquiries are matched to existing Leads or sent for human handling when they are past customers. Staff should check the new Lead and its enquiry note rather than re-entering these enquiries manually. In Leads, including the enquiry note on the new or matched Lead.
- Technicians can enter a customer's first name and mobile in the Referral Invite form and submit it without switching apps. The invite now sends from a DeGroot number, and the form shows whether it was sent or why it could not be sent. In the FSM technician app, from the Referral page and its Referral Invite form.
- The scorecard now reads the live SafetyCulture Technicians Observed response correctly, so valid audits can contribute to the quality measures. The audit panel also opens beside the row you are reviewing. In the technician scorecard and its audit details.
- Account Total Sales is now calculated from sold Opportunities automatically, including on the Commercial account layout. You will see the value on the Account instead of relying on an update after each edit. On Account records, in Account Information.
- Lead-paint proposals now show the Full Re-Screw option when the roof substrate supports it. Re-submitting an already accepted proposal also no longer moves the Opportunity backwards. In the customer proposal and its related Opportunity.
- Lead-paint totals no longer add the compliance fee twice, and the CRM keeps the original roof substrate so re-screw and re-pointing work can be shown correctly. This prevents proposals and deposit invoices using an overstated total or missing work. On lead-paint Opportunities, in the roof details, proposal total, and deposit invoice.
- Area pages now show the open pipeline split by Opportunity stage, and marketing spend and running-month figures use the relevant delivery dates and today's partial-day cutoff. On the area pages, in the Open Opportunities and marketing sections.
- Technicians can now open Referral in the FSM app to view their personal link and QR code. The ready-to-copy customer message is shown on the page instead of a text-message button. Open the FSM app and select Referral from the technician menu.
- Proposal totals now use the accepted amount consistently, and gutter add-ons are calculated from the billed Opp product. Rechecking a gutter option no longer compounds the amount. You will see the corrected total on customer proposals when reviewing roof and gutter options.
- When an invoice salesperson cannot be found from the Operations Manager, the CRM now falls back to the Opp Owner. Repair notes identify the address staff need to add as an active Books salesperson. Check the invoice repair note on the Opp when a Books salesperson needs attention.
- Enquiry details captured through the intake process now appear in the related CRM note, so staff can review the information from the enquiry record. Open the enquiry Lead in the CRM and check its Notes area.
- Technicians will now see a specific result when sending a referral, including whether the person was already invited, the text was sent without a CRM Lead, or the referral link could not be created. The referral email also links to the new walkthrough and explains the “We text it for you” option. In the FSM Referral page and the referral email sent to technicians.
- Commercial progress invoice drafts will now carry the salesperson when the CRM can match one, so invoice attribution is consistent across billing streams. In Zoho Books on commercial progress invoice drafts created from the CRM.
- Technicians can now change a checklist task's Status and see its Description and Instructions for context. The task view shows the number of photos and opens the checklist detail view when technicians select View photos. In the FSM Portal checklist task view and Task Details form.
- The job-hours scorecard now gives clearer actions for unscored SafetyCulture audits, including suggested crew details and a guided way to record a legacy-form attribution. From October, qualifying legacy audits can also be matched from that day's labour records. In the job-hours watchdog email and SafetyCulture scorecard workflow.
- Generated job descriptions will use the CRM's current AI connection again, and exclusions will no longer show stray formatting marks. Failed matches now report their error instead of stopping the rest of the run. In generated job descriptions and the related job-processing results in the CRM.
- For repair and pressure washing jobs without lichen, crews will no longer be sent mould treatment unnecessarily. The CRM now keeps the preparation volume aligned with the roof condition. Check the preparation and treatment fields on the Opp or related FSM job.
- The CRM now checks referral invoices and groups findings by Opp, so invoice issues are easier to review and act on. Review the referral invoice monitor results and grouped findings in the CRM billing checks.
- When you reopen a saved property, manually added roof edge tags and Street View framing are retained instead of being cleared. You can continue measuring without re-entering those details. In the quoting tool when reopening a saved property or returning to a recently saved survey.
- The quoting tool now checks that archived aerial clips are linked to a stored property identity before reusing them. If a clip cannot be safely matched, the system fetches the imagery again instead. In the quoting tool's aerial imagery and property library views.
- [fsm] harden lead paint clone billinglog
- [scope] replace Acryloc topcoat for NuTech Silverlog
- [invoicing] pin GST on taxable Books lineslog
- [scope] normalize product IDs before exclusionslog
- [scorecard] observe callbacks without timeline eventslog
- [automation] refresh fixed-price job economicslog
- [job-hours] enable nightly economics recomputelog
- [widget] keep provisional economics neutrallog
- [invoicing] repair Monday progress billing runlog
- [jobhours] serialize CRM token refreshlog
- [job-hours] add advanced missing-hours reviewlog
- [job-hours] use current Streamlit dataframe widthlog
- [finance] mirror Xero credit notes into Bookslog
- [finance] pass credit note numbering flag in querylog
- [finance] attribute Xero credit note mirrorslog
- [pricing] exempt referral discount from not-accepted-roof zeroinglog
- [portal] early address-completeness gate on MR formlog
- [area-pack] canonical roof_enquiries_v1 metric + evidence contractlog
- [briefing] client-portal MR failure + blank-street checkslog
- [scorecard] exclude contractors from roster; flag invalid SafetyCulture inspectionslog
- [prework] create technician note before FSM stage writelog
- [prework] hoist form-value and colour parsing above the note blocklog
- [outreach] declined roof quote cohort builder for HR offer taglog
- [job-hours] route the daily job digest per Operations Managerlog
- [job-hours] name the fix on unresolved-technician nagslog
- [job-hours] nightly FY-window sweep for old unresolved crew tokenslog
- [area-pack] Google sign-in via tinyauth, basicauth kept for scriptslog
- [job-hours] source runtime.env in the VPS wrapper so hand runs match the servicelog
- [daily-notes] file checklist rows by job address when the actor is not a field techlog
- [area-pack] forwardAuth via loopback port, host-mode traefik has no docker DNSlog
- [daily-notes] flag deal-routed digest items that carry no VIC/TAS regionlog
- [xero-sync] skip DELETED Xero payments when replaying into Bookslog
- [daily-notes] recover a digest region from the deal before calling it unidentifiedlog
- [ops-routing] opsRoutingPanel, the widget-facing read/write for the routing variablelog
- [ops-routing] CRM-side invokeurl uses connection "crm", not crm_connectionlog
- [ops-routing] "Who covers what" Web Tab widgetlog
- [invoicing] legacy money-matched progress invoices count as coveredlog
- [invoicing] Monday run auto-drafts held catch-up invoices behind a floorlog
- [invoicing] Weekly Billing Queue rows and a Send/Fix/FYI digestlog
- [job-hours] missing-hours queue also goes to each placeholder deal's Operations Managerlog
- [invoicing] delete stale queue rows via the CRM REST APIlog
- [invoicing] guard every left() in the row builderlog
- [invoicing] one FYI row per legacy deal, current-week jobs are not catch-up failureslog
- [invoicing] compare work dates as dates in the current-week checklog
- [area-pack] opportunity flow per review fortnight, three-chapter pageslog
- [invoicing] Weekly Billing web tab with Send, Dismiss, Refresh, Re-runlog
- [invoicing] weekly billing panel reads rows by COQL id, not searchlog
- [area-pack] one review-fortnight select drives the daily charts and the flowlog
- [area-pack] marketing charts, prospects per day and spend by month against budgetlog
- [fsm] create FSM Client with the E.164 phone and mobilelog
- [fsm] daily canary flags phone-less Clients on open jobslog
- [invoicing] sync deal invoices under the deposit path's identity policylog
- [invoicing] keep the final draft on its deal when the customer changeslog
- [invoicing] stamp every Books invoice with its CRM deal and re-attach by itlog
- [fsm] Client on-validate rule fills Mobile from Phone for landline-only contactslog
- [invoicing] fill a blank Books customer email under account routinglog
- [invoicing] never create an unlinked Books contact person for a CRM contactlog
- [scope] every trim product's scope paragraph states its own pricelog
- [crm-digest] resolve siblings by package, never by bare module namelog
- [products] close the downpipe band gap and retire PR-045log
- [scripts] zoho_bulk helpers and a credit-safe shadow-lead converterlog
- [resync] refuse to write function_registry.json from a --only/--limit subsetlog
- [gp-sign] function-backed Send and Replace buttons so the sender runs as the clickerlog
- [servicetasker] automate purchased lead intake into CRMlog
- [servicetasker] pass the note Parent_Id as a string idlog
- [servicetasker] match a repeat customer before creating a Leadlog
- [servicetasker] correct the note diagnosis in 97eab454log
- [servicetasker] skip converted leads in the backfilllog
- [referral] FSM Referral page spec and one-off launch SMS function (not yet deployed)log
- [servicetasker] keep the test files out of the Apps Script pushlog
- [crm] bulk_write_mode kill switch for the Contact/Account workflow cascadelog
- [briefing] CRM API credit gaugelog
- [scripts] api_credit_preflight prices a bulk CRM job before it runslog
- [servicetasker] decode Gmail bodies without base64DecodeWebSafelog
- [crm] suppress triggers on the international phone write-back toolog
- [referral] FSM Referral page built; snippet source and component ids recordedlog
- [crm] close four more Contact/Lead workflow write-back leakslog
- [area-pack] show the open pipeline split by stage on every area pagelog
- [servicetasker] Gmail part bodies arrive as bytes, not base64log
- [referral] extract the href from the Creator url field so the FSM Referral page renderslog
- [referral] restore the image type on the live Referral page and correct three doc defectslog
- [scorecard] find unattributable SafetyCulture audits and tell their authorlog
- [hooks] stop the pre-commit git environment leaking into the staged-tree pytestlog
- [tests] stop the MR email audit test operating on the real repositorylog
- [watchdog] Mac delivery watcher checks the bundle marker, not the retired digest keylog
- [job-hours] Missing hours queue goes to Bailey onlylog
- [fsm] stop FSM-missing alerts on pending lead-paint replacementslog
- [area-pack] a marketing dollar sits in the month the ad ranlog
- [area-pack] marketing spend runs to today, not to yesterday in Californialog
- [pricing] Force_Amount is the final total, not a fee-exclusive baselog
- [area-pack] the VPS builds and publishes the pack dailylog
- [pricing] keep the substrate when lead paint takes over Conditionlog
- [proposal] show re-screw on lead-paint quotes, and stop acceptance rewinding the stagelog
- [scorecard] read Technicians Observed from the holder SafetyCulture sendslog
- [scorecard] attribution audit dates in Melbourne and reads for approvallog
- [vps] the area pack deploys from a commit, not from a working treelog
- [referral] create the Lead with the native task, not an unnamed connectionlog
- [vps] the mid-build deploy guard never firedlog
- [creator] repair the CustomerProposal mirror and detect mirror driftlog
- [scorecard] flag the 4 Sep demonstration audits so they can be undonelog
- [proposal] ship the 2026-08-08 pricing fixes, distributed not groupedlog
- [drift] stop counting undeployable doc headers as repo-ahead driftlog
- [drift] ignore comment lines on both sides, not just the repo headerlog
- [scorecard] rank the board before anyone has the days minimumlog
- [referral] office texts the invite, and the send result is office onlylog
- [scorecard] the audit panel opens under the cell you hoveredlog
- [drift] weekly alert for repo-versus-live deploy driftlog
- [referral] turn the customer invite text onlog
- [drift] log why the deploy-drift check crashed, not just that it didlog
- [pay] adopt live WorkOrderPriceUpdate, which excludes the compliance feelog
- [drift] tell an empty sweep apart from a changed output formatlog
- [briefing] flag deals at/past Job Created with no FSM joblog
- [books] resolve the salesperson from the Operations Manager, falling back to Ownerlog
- [audit] catch an opportunity left behind its own signed acceptancelog
- [books] the salesperson sync note stops naming a role it cannot knowlog
- [referral] dedupe before the text, and tell the technician what actually went wronglog
- [lead-paint] stop the FSM transfer failure reporter from throwinglog
- [area-pack] opportunities to add, where the FY lands, and one Quote Sent stagelog
- [gemini] read the API key from the org variable, not a hardcoded literallog
- [books] stamp the salesperson on commercial progress invoiceslog
- [job-description] strip markdown headers out of the LLM Exclusions blocklog
- [address] read the Google key from the googleAPIKey org variablelog
- [fsm] read the Gemini key from CRM, removing the last hardcoded copylog
- [pricing] repair and pressure washing stops costing Mould Ridlog
- [roof-care] gate canaries on a synthetic Deal name, retire the standing test Deallog
- [drift] stop comparing handleCustomerEmailFailure1 against the wrong live functionlog
- [watchdog] make the 07:00 breach email a to-do listlog
- [scorecard] suggest the crew for an unscored audit from that day's labourlog
- [haymes] stop the matcher failure reporters from throwinglog
- [referrals] stop processReferralBacklog dying on its own failureslog
- [job-economics] guard the blank Work_Date read and the error reporterlog
- [progress-invoice] a blank date no longer empties the draftlog
- [scorecard] attribute a legacy-form audit with one VPS commandlog
- [area-pack] the follow-up row says Quote Sent, matching what it now countslog
- [scorecard] score legacy-form audits from labour, signed 2026-09-05log
- [scorecard] attribution_source column reaches a legacy DBlog
- [functions] functions_py/ home for Python and Node CRM functions; resync checks them against the deployed copylog
- [haymes] Python 3.12 rollup backstop, dry-run verified against the Deluge filter (ADR 0095)log
- [fsm] mirror pulls three live-only handlers; ADR 0095 records the backstop cut-overlog
- [fsm-checklist] make the Portal Job Checklist ZML schema-validlog
- [fsm-checklist] task view counts photos and opens them in the native formlog
- [fsm-checklist] "View photos" loads the originals on request instead of the native formlog
- [drift] CRM function drift is a daily briefing check read from Functions__s, compared against origin/mainlog
- [fsm-checklist] "View photos" opens the trimmed Job_Checklist detail viewlog
- [fsm-checklist] "View photos" link needs an absolute URLlog
- [fsm-checklist] technicians can change a task's Status from the Task Details formlog
- [area-pack] one budget denominator for marketing spendlog
- [area-pack] expected from open quotes, each weighted by its agelog
- [Quoting Tool - ui] carry edge tags through cold session loadlog
- [Quoting Tool - property-library] keep the folded read and claim paths exactly as narrow as beforelog
- [Quoting Tool - raster] keep the serve module silent and inside the write-seam guardlog
- [Quoting Tool - condition] type the exported tile collector and keep the adjudicator guardlog
- [Quoting Tool - raster] type the coverage bbox honestly and pin the synchronous invalidationlog
- [Quoting Tool - ai-archive] require a stored identity before serving an archived clip (#661)log
- [Quoting Tool - ui] drop in-flight analysis token when deleting a manual rooflog
- [Quoting Tool - review] drop the orphaned MCP Street View tool and keep TC/out out of Docker buildslog
- [Quoting Tool - deploy] pin VPS smoke TCP to the Tailscale hostlog
- [PayrollPilot - payroll] preserve local weekly dateslog
- [PayrollPilot - react] move date helper out of component modulelog
- [PayrollPilot - payroll] remove rejected upload fileslog
Week of 24 August 2026 611 changes
- You'll now see refreshed job detail layouts across desktop, phone, and tablet, including the restored Active Jobs card and clearer Daily Job Log history. Use the job detail screen as usual and report anything that looks out of place. FSM job details and the Active Jobs card.
- The CRM and FSM now use a Job In Progress stage for jobs that have started but are not complete. You'll see the stage reflected in Opps, job links, workflows, and related reporting. Opportunity Stage, linked FSM Jobs, and the Active Jobs views.
- The daily job reports now bring crew hours, Daily Job Logs, checklist activity, and checklist photo evidence together by job. You can open checklist tasks and their photos directly from the report. The Bailey full report and Jamey's daily job-hours digest.
- Deposit invoice readiness is now checked against the live CRM information before the related workflow continues. You'll see fewer actions proceed when the deposit is not ready. Opportunity deposit and invoice workflow.
- The duplicate contact and Opp check now gives the corrected advisory when matching records are found. Contact and Opportunity creation or update screens.
- When lead paint replacement is required, the CRM now guides the transfer from the existing FSM Job to a controlled replacement Opp and keeps the related attachments and billing linked. Follow the lead paint action rather than creating a replacement job manually. The lead paint action and replacement Opportunity workflow.
- Technicians can now open the details of completed and N/A checklist tasks from the Mobile Job Checklist. The action only displays the task, and does not reopen or change it. Mobile FSM Job Checklist, on completed and N/A task cards.
- Gutter guard selections for roofs 2 and 3 now save and display against the correct roof in proposals. Check the correct roof's selection when reviewing or accepting a proposal. Customer Proposal gutter guard add-ons.
- The CRM now uses the Operations Manager information to resolve the salesperson on Books invoices and invoice sync notes. Review the salesperson shown on new or updated invoices as usual. Opportunity invoice area and Zoho Books invoice records.
- Timed-out Xero payment checks now retry automatically, reducing false payment exceptions caused by a temporary connection delay. Invoice payment status and the daily sync monitor.
- The quote signature process now verifies document access before sending and advances the quote to the verified stage after a successful send. Opportunity proposal and quote signature actions.
- The CRM now recovers when multiple job or client updates happen at the same time, reducing failed or incomplete job records. Staff should see fewer interruptions when creating jobs. When creating or updating jobs and client records in the CRM.
- When a customer accepts a quote, the CRM now creates Amanda's task to follow up and confirm the acceptance. No change is needed to the quoting process. In the CRM Tasks list and the related Opportunity task area.
- Quote totals and add-ons now stay consistent when you change gutter options, roof selections, surface areas, or approved variations. The CRM also keeps manual price overrides and accepted totals from being unexpectedly replaced. In the Opp pricing fields, product lines, and proposal totals.
- Proposal scope text now keeps salesperson-entered notes when scopes are regenerated, formats money consistently, and describes gutter guard as covering gutters only, not valleys. Gutter measurements are also included where the proposal wording supports them. In the proposal Scope of Works and per-roof scope fields.
- Job descriptions now show the actual gutter guard run length by roof. If the length cannot be confirmed, the description tells the crew to check with the office instead of showing an invented measurement. On the FSM Job Description and related job details.
- FSM job cards now show the client contact more clearly, while completed jobs retain their start and finish dates in the card layout. In FSM Job cards, including completed Jobs.
- Technician Job reports now apply their stage and assignment filters together, so staff should no longer see Jobs from the wrong stage, another technician, or the cancelled archive. In the FSM New, Accepted, Active, Completed, Calendar, and missing-checklist Job reports.
- When an Opp has no Invoice Email, the CRM now uses the Account Email for invoice recipients and deposit setup. This reduces invoice holds where the sales contact has already supplied the account address. In the Opp invoice email and deposit invoice workflow.
- The daily job-hours report now retries after temporary network failures, stays enabled during installs, and alerts Bailey when delivery or a scheduled service fails. In the daily job-hours report email and its delivery monitoring.
- Job checklists now repair missing template tasks without removing technician evidence or valid upsell tasks. Daily checks also identify incomplete checklists and send unresolved alerts to the application administrator. Open the checklist from the Job record or FSM job workflow.
- When a lead's company name is blank or only differs by capitalisation, the CRM now keeps the manually entered business name. New Opportunities also avoid carrying forward the old placeholder ending in "Lead !". Review the Company field on Leads and the Account and Opportunity names created from them.
- When an add-on is removed from an Opp, the CRM now removes the matching managed line from the FSM Job Description. Free text and unmanaged labels are left unchanged. Check the Job Description on the FSM Job linked to the Opp.
- On Opps, Job Notes and Work Log now show technician notes and Daily Job Logs with clickable records, photo counts, and attachment access. You can also add a note or Daily Job Log directly from the related list, with the Job prefilled. Open an Opp and use the Job Notes and Work Log related list.
- Technicians can now see earlier crews' dates, names, hours, comments, photos, signed JSAs, and completed or not-applicable task history on multi-day jobs. Completed tasks open in a read-only view, with an Amend option where permitted. Open a job's mobile checklist in FSM and select completed history or a completed task.
- The image browser now lets you send a confirmed Before and After pair to Billboard Maker. The control only becomes available when the selected pair is valid for the job. Use the Billboard Maker handoff control in the image browser.
- Technicians now receive clearer Maintenance Request notifications that identify the request and can acknowledge it from the linked page. Reminder and operations notifications now keep the request identity and acknowledgement history consistent. Use the links in Maintenance Request technician notifications, or open the request in FSM.
- The system now records whether Zoho Sign quote emails were delivered, so failed customer signature deliveries can be identified and followed up. Review the quote signature delivery information in the CRM proposal workflow.
- Gutter painting metres are no longer shown in customer proposals. Review the generated roof scope in a proposal.
- Repair and pressure-washing proposal wording now makes clear that the cleaning covers ridges, valleys, and gables, and explains how pointing is used for a full clean with repairs. Review the scope descriptions and tooltips when preparing an Opp proposal.
- Pricing field labels and tooltips in the CRM now use simpler business language. You will see the revised wording when reviewing Opp Products and variations. Open an Opp's Products and variations pricing fields.
- Missing-hours cards now link to CRM placeholder records that operations managers can edit, with clearer reasons for review and escalation when items remain unresolved. The daily report now still arrives when data is stale, with a visible stale-data notice. Use the nightly needs-you cards, daily job-hours report, and CRM labour records.
- Email delivery failures now include the reason returned by Google Admin, making it easier to identify why a customer or staff email did not send. In the CRM email delivery failure or bounce details.
- When technician roof images are added, the CRM now keeps the approved proposal image as well as the additional technician images, without replacing the approved image. In the Opp's roof image fields and the related FSM job record.
- Operations managers can now view all crews' Daily Job Log entries in one report, rather than only the technician-scoped view. In the CRM's FSM reports, under the all-entries Daily Job Log report.
- The area pack now opens on a Last 14 days view and includes sales pace, cumulative target, and funnel charts to make recent performance easier to read. In the area pack pages and its daily email.
- The CRM now checks the CRM job sub-stage and all Creator validation blockers before sending inactivity warnings or completing a maintenance request. It also marks abandoned pending checks as stale and avoids reusing completed Tasks, reducing incorrect auto-close activity. Maintenance Request records and their related Tasks and notifications in the CRM.
- Adding or opening a technician note on an Opp is now more reliable, including when the note URL contains special characters. Staff should be able to open the single-note form without the previous timeout or fallback behaviour. Opps, Job Notes and Work Log related list.
- Resending a proposal with pictures will no longer move an accepted Opp back to an earlier stage. Amanda can resend the proposal without needing to restore the stage afterwards. Opps, proposal send and resend actions.
- Proposal images now use the pictures uploaded to the CRM as the source of truth. Staff should check the CRM image uploads when preparing or reviewing a proposal. Opp image upload fields and proposal preview.
- Invoice drafts are now held until they pass the required checks and are explicitly released. Amanda should review the draft and recipient details before releasing an invoice. CRM invoice actions and the Zoho Books invoice record.
- The Monday progress invoice review now shows the evidence behind each SEND or CHECK result, including labour, technician notes, source invoices, missing hours, stalled Opps, and completion warnings. Reviewers should use the evidence and resolve CHECK items before sending. Monday progress invoice digest and Maintenance Request billing records.
- Technician job reports now use the correct assignment and stage visibility again. Technicians should see the jobs assigned to them in Active Jobs without the previous report filtering issue. FSM Active Jobs and technician job reports.
- When an Opp is moved to Touch Ups Required, the related FSM job now moves there when appropriate and remains visible in technicians' Active Jobs. Operations should use the Touch Ups Required stage as usual. CRM Opp stage and FSM Active Jobs.
- On touch-up re-completion, the Daily Job Log now protects the recorded total paint usage from being reduced and keeps the correct completion history. Technicians should check the prefilled usage and only add the latest visit's amount as intended. FSM Daily Job Log completion form.
- General painting quote signature requests now use the updated signing flow for email and SMS requests. Staff sending a quote for signature should use the normal CRM action and check that the request is addressed to the customer. Opps, proposal and quote signature actions.
- Inbound customer SMS replies are now mentioned in the CRM and forwarded according to the Opp stage and assigned operations manager. Staff should look for the reply with the Opp's responsible owner or operations manager. Opp notes and inbound SMS notifications.
- Scheduling and pre-work form resend emails now use the Opp's assigned operations manager as the contact and reply-to, instead of a region-based default. Staff do not need to change their normal process. Opp Operations Manager field, scheduling notifications, and pre-work resend actions.
- Customer SMS history now supports Accounts, more phone numbers, searching, a sender choice, and a clear no-reply label for one-way messages. SMS STOP replies and unsubscribe links are now recorded separately from email opt-outs, so the CRM will stop future SMS without blocking email. Customer SMS History widget on Contact, Lead, and Account records.
- Bailey and Jamey can now review flagged zero-hour notes in one panel, enter decimal hours, confirm that no billable hours apply, add technicians, and see same-day crew context. The Daily Job Review also gives a stronger warning when a field note has no hours recorded. Open the Missing Hours panel and Daily Job Review from the CRM job-hours tools.
- The CRM now has a Job Review view with clearer names, day activity sorting, adjustable sizing, and saved sort preferences. Use it to review job activity in the order that suits you. Open Job Review in the CRM job-hours area.
- Roof imagery notes that sync from proposals are now visible alongside crew notes in Job Notes and Work Log, labelled Auto Images. Open the Job Notes and Work Log related list on an Opp.
- The CRM now clears a deposit verification when its invoice is voided and shows the actual reason when billing is blocked, such as a draft or unsent invoice. Deposit checks also avoid blocking valid work because of unrelated changes on the Opp. Check the deposit and billing status fields and the Hold and Approved validation message on an Opp.
- Invoices now stay attached to the correct Opp when the customer changes, Books contact persons use the supplied customer name, paid flags reconcile more reliably, and invoice email audit history keeps all entries. Review invoice links, contact details, payment status, and email history in the CRM and Books.
- Tile rebedding and repointing checklist tasks now require three photos, and completed tasks with missing evidence are flagged for amendment. Staff can open and act on checklist tasks from any device, subject to the existing JSA completion requirement. Open the checklist on the CRM job record or FSM portal.
- Amanda will no longer receive the overdue invoice finance visibility emails. The system has changed who receives these notifications. These notifications are sent by the CRM as overdue invoice finance emails.
- The quoting tool now carries detected solar panel counts into the Opp and offers an EWP hire option for cut-in work on double-storey roofs. Check the suggested option before sending the quote. On roof cards and the inline product suggestions in the quoting tool.
- The quoting tool now shows imagery and parcel loading problems directly on the map instead of leaving them hidden in the background. TrueOrtho and roof boundary handling has also been corrected, so retry or review the map message when imagery does not load. In the imagery map and measurement workspace.
- You can now use the feedback button in the quoting tool to send a screenshot and context when something looks wrong. In the main quoting tool screen.
- When Nearmap has no available imagery for a property, the quoting tool now uses Google satellite as the map background and labels the source clearly. In the imagery map and its status message.
- You can now send feedback from the quoting tool, including a screenshot, by using the feedback button. This gives the team a quicker way to report anything that looks wrong. Use the feedback button in the quoting tool.
- The quoting tool will no longer show a property as having no imagery simply because only local survey information is available. Coverage will remain unknown until the online imagery response confirms the result. Check the imagery coverage status on the property and survey screens in the quoting tool.
- The quoting tool now keeps local survey imagery usable when coverage details differ slightly, and falls back to preview imagery instead of showing a blank or black map. Networked properties can also use a locally complete survey where available. Open a property in the quoting tool and view the imagery map or survey selector.
- When dividing roof surfaces, draw the cut line and press Enter to commit it. The preview now shows the pieces and areas, the cursor prompt stays within the map, and the tool returns to Select after the split. Use the split tool on the property measurement map.
- Nearmap survey costs are now clearer in the survey date selector, including which choices may incur a cost. Check the label before selecting a survey date. Open the Nearmap survey date selector in the quoting tool.
- Previously cached imagery can now be shown in the quoting tool even when a current imagery token is unavailable. Unauthorised imagery requests are no longer attempted. View the imagery gallery and map on a quoting property.
- The Offline Library status card is hidden while a property is still loading, so the loading screen is less distracting. Open a property in the quoting tool.
- Roof labels now keep their identities when roofs are split, deleted, merged, or restored. Renamed roofs are less likely to be overwritten while a property loads. View roof cards and labels on the property measurement map.
- Very small AI-detected roof areas are now automatically excluded, with one Restore control for bringing excluded roofs back. The map also avoids repeating the same focus-area actions, and saved times change to an age when they are older. Check the roof measurements panel and autosave message on the property map.
- Roof surfaces that cannot be painted are now excluded from the measurement and quoting controls, so review the remaining roof cards before preparing a quote. Review the roof cards and measurement panel on the property map.
- Property boundary editing and status controls have been brought together, making it clearer when boundary review or adjustment is needed. Use the boundary controls and map status area on the property screen.
- Roof accents and manually drawn roofs now highlight more consistently on the map and in the roof cards, including when another roof is selected. View roof cards and the map highlighting on a quoting property.
- Roof section details, including abutment cut-ins and material information, now stay attached to the correct roof face when sections are changed. Review the roof cards and section controls on the property map.
- The quoting tool now keeps the classification decisions used for roof sections and danger details, making the selected result more consistent when preparing a quote. Review the classification and roof section details in the roof cards.
- Pointing detection no longer repeatedly restarts while imagery loads, reducing the risk of the property map freezing or crashing. Refinement work now continues with fresher roof and imagery details. Open a tile-roof property and review the pointing detection on the measurement map.
- When you reopen a property in the quoting tool, the saved time will no longer show a previous session's clock time. Saves older than ten minutes will show as an age instead. In the saved status shown on the property measurement screen.
- Buttons and panels in the quoting tool have clearer text and backgrounds in both light and dark themes. You should now be able to read the affected actions and Nearmap tabs more easily. In the quoting tool, check the status popover, contact window, Nearmap tabs, filters, and approval panels.
- Before spending Nearmap credits, you'll now see the survey date and the quoted credit cost, with the spend action unavailable while that quote is loading. The imagery gallery also separates imagery we hold from imagery Nearmap offers and puts older surveys behind Show all. In the quoting tool's property imagery gallery and the Nearmap survey spend dialog.
- When stepping through imagery survey dates, the date list now closes and the control keeps focus, making it easier to continue reviewing surveys. In the quoting tool's imagery survey date control.
- In narrow quoting panels, product names can now shorten without squeezing the other controls. You'll still be able to use the product controls as usual. In the product selection area of the quoting tool.
- You will now see the engine-calculated rescrew price on the product chip when it applies, so you can check the amount while reviewing an Opp. In the roof cards within the quoting tool.
- When you drag the first or last point of a closed roof outline, the matching endpoint now stays connected instead of leaving a gap. In the roof measurement workspace in the quoting tool.
- The imagery library badge and test-run availability now check for the full imagery bundle, including older records that do not have the newer status field. In the imagery library rows and the run-test controls.
- When a customer completes the pre-work form, the CRM now sends one completion update instead of two, preventing duplicate deposit invoices from being created. Staff should continue processing the completed form as usual. The completed form status and deposit invoice are visible on the related Opportunity and its finance records.
- The CRM now contains an approval-gated process for warning about and completing inactive maintenance requests, while CRM On Hold and FSM Job Not Ready requests remain excluded. Maintenance Request records and the related operations notifications.
- The quoting and proposal workflows now recalculate solar cleaning and gutter formulas from the relevant quantities, and preserve accepted gutter cleaning lines as billable snapshots. Quote Accepted also sends an owner notification. Opportunity products, quote acceptance, and proposal add-on sections.
- Campaign follow-up SMS now has a trust-first pilot mode with approval and reporting controls.
- The quote-lock snapshot now excludes lead-compliance revenue before calculating the contractor-eligible amount, preserving the live calculation during future deployments. This affects the internal quote-lock and contractor amount calculation rather than a staff screen.
- The scheduling approval process now carries its date window through the cycle, catches up missed monthly fires, and sends approval emails only after the cycle is safely saved. The ledger write path has also changed to support larger approval cycles. Scheduling approval cycles and approval notifications.
- Flexible scheduling discounts are now limited by actual travel savings, stay fixed after acceptance, and can be opted out of per Opp. Flexible scheduling and travel fee fields on an Opp.
- The CRM now preserves locked roof and product details during recalculation, keeps product row links in the final sync, and generates tile replacements per roof. In Opp product lines, roof calculations, and pricing updates.
- The scheduling approval panel has changed, including approval undo, rolling approval cycles, stale-widget protection, and filtering of in-progress jobs for the pilot. Scheduling approval panel.
- The CRM now prevents declined-opportunity follow-up tasks from being bypassed when an open task already exists. Opp follow-up tasks and outreach controls.
- Scheduling approvals can be opened by active CRM users, and Jamey can send approvals. Open the scheduling approval panel in the CRM.
- The quoting tool now reads live CRM pricing settings, preserves existing height safety adjustments, and blocks pushes when the pricing context is unavailable. Kliplok and other roof pricing calculations have also changed. In the quoting tool when reviewing roof pricing and sending an Opp to the CRM.
- Height safety can now be adjusted by linear metre, the adjustment is retained when quotes reload, and shared roof edges are counted once rather than twice. On roof cards and the pricing summary in the quoting tool.
- Danger classification now uses a shared rule, including the storey toggle and a verandah exemption, and no longer infers danger from roof height alone. On roof cards and in the quote wizard's danger classification.
- The quoting tool adds a default scope for tile repairs and a comparison between quoting-tool pricing and CRM pricing. The changes are in the roof cards and quote summary.
- Roof sections now support parent material sections, boundary edge tags, and per-edge protection and gable controls. The controls appear in roof cards and the property measurement map.
- The quoting workflow adds roof alternatives, reprices them from the current measurement, preserves edge choices, and requires section confirmation before pushing a quote to the CRM. Use the roof cards, quote summary, and CRM push controls in the quoting tool.
- The quoting tool and CRM now keep more quote selection and pricing comparison information together when a quote is reviewed or synchronised. In the quote selection and pricing comparison areas of the quoting tool and CRM Opp.
- [fsm] finalize job detail layoutslog
- [job-hours] pull pending BrightHR leave dailylog
- [job-hours] integrate daily logs and checklist activitylog
- [job-hours] scope Blip warnings to report windowlog
- [area-pack] align follow-up compliance contractlog
- [job-hours] scope nightly summary to report windowlog
- [validation] verify deposit readiness livelog
- [fsm] recover concurrent job createslog
- [automation] correct duplicate deal advisorylog
- [area-pack] show estimated and recorded marketing spendlog
- [crm-digest] add approval-gated Monday Thursday deliverylog
- [crm-digest] align approval compose commentlog
- [crm-digest] use Melbourne dates for scheduled runslog
- [fsm] add Job In Progress deal stagelog
- [meta] send CRM conversion eventslog
- [meta] use secure Zoho connectionlog
- [meta] parse CRM event timestampslog
- [fsm] satisfy CRM client script validationlog
- [fsm] align live CRM stage metadatalog
- [fsm] fail closed on layout stage driftlog
- [fsm] wire Job In Progress CRM workflowslog
- [fsm] use CRM-safe progress workflow namelog
- [reporting] sanitize custom view update fieldslog
- [reporting] omit unchanged custom view fieldslog
- [fsm] enrich progress backfill manifestlog
- [reporting] build dashboard writer payloadslog
- [reporting] retry transient dashboard updateslog
- [crm-digest] add reply invitation footerlog
- [crm-digest] restore skip workflowlog
- [campaigns] automate Meta CRM audienceslog
- [crm-digest] clarify customer impact in staff copieslog
- [payments] retry timed-out Xero payment checkslog
- [gp-sign] validate owner document accesslog
- [fsm] add lead paint replacement workflowlog
- [gp-sign] advance verified quote stagelog
- [fsm] bind lead paint workflow safelylog
- [fsm] open completed checklist taskslog
- [fsm] stop progress stage task churnlog
- [job-hours] show checklist task photo evidencelog
- [job-hours] inline checklist photo evidencelog
- [job-hours] open checklist photos directlylog
- [job-hours] align digest with FSM stageslog
- [job-hours] separate field and office updateslog
- [job-hours] lead cards with crew and checklistlog
- [job-hours] show only daily checklist evidencelog
- [job-hours] align activity card orderlog
- [job-hours] reconcile activity reports with shared designlog
- [automation] enforce one open workflow tasklog
- [billing] deduplicate invoice blocker taskslog
- [fsm] reconcile booked jobs after linklog
- [crm] prepare clean progress stage cutoverlog
- [automation] suppress task create triggerslog
- [fsm] use deployable stage caller signaturelog
- [deluge] align deployed function signatureslog
- [fsm] align projection caller namespacelog
- [automation] retain workflow function actionslog
- [deluge] align proposal workflow signaturelog
- [automation] verify normalized workflow bindingslog
- [crm] harden progress stage cutoverlog
- [crm] include stage forecast metadatalog
- [crm] place clean progress stage optionlog
- [crm] swap progress stage references safelylog
- [crm] use effective stage metadata transportlog
- [crm] accept native clean stage optionlog
- [ops] block unpushed deploys, surface in-flight worklog
- [crm] normalize native stage actual valuelog
- [crm] pin exact progress stage identitylog
- [fsm] make stage audit repeatablelog
- [job-hours] make production deploys monotoniclog
- [automation] set Tasks \$se_module on ensureOneOpenDealTask createslog
- [invoicing] resolve Books salesperson from operations managerlog
- [campaigns] add Bendigo SMS senderlog
- [campaigns] allow carrier-sent SMS releaselog
- [proposal] write and read gutter guard on the real Deal fieldslog
- [proposal] make computeTotals the single authority for the customer totallog
- [proposal] quote gutter add-ons from the billed line, not the formula fieldlog
- [pricing] map gutter guard to its real fields in the quote-lock addendumlog
- [fsm] give the crew the real gutter guard run lengthlog
- [pricing] stop blank roofs, stale tile areas and lost overrides in the enginelog
- [pricing] un-ticking gutter guard now removes the charge on an unlocked deallog
- [scope] format scope money and quote gutter metreslog
- [scope] stop generated scope overwriting hand-written textlog
- [pricing] keep in-memory deal in step with pre-refetch writeslog
- [pricing] emit per-phase timings from onOppUpadatelog
- [campaigns] add SMS reply reporting and recoverylog
- [invoicing] add inert deal-to-invoice sync backstoplog
- [campaigns] add approval-gated email reportslog
- [job-hours] recover blocked daily report deliverylog
- [fsm] show client contacts on job cardslog
- [fsm] use generated timestamp checklist sentinellog
- [pricing] calculate paint from zero-area surface productslog
- [fsm] call checklist generator by namelog
- [fsm] migrate complete checklist sentinels safelylog
- [fsm] derive checklist sentinel from task timelog
- [fsm] use one contact field on job cardslog
- [campaigns] use supported roof suburb querylog
- [fsm] stamp checklist from first task timelog
- [fsm] stamp sentinel from checklist taskslog
- [fsm] write checklist sentinel directlylog
- [fsm] persist checklist sentinel with update tasklog
- [fsm] coerce checklist job id before updatelog
- [fsm] keep checklist sentinel immutablelog
- [fsm] fit contacts on completed job cardslog
- [fsm] heal partial job checklistslog
- [fsm] match completed card date formulalog
- [fsm] name completed card date fieldlog
- [scorecard] make paid scoring fail closedlog
- [fsm] preserve legacy checklist taskslog
- [scorecard] attribute verified legacy auditslog
- [fsm] add daily checklist safety netlog
- [fsm] isolate daily checklist job checkslog
- [fsm] batch daily checklist scanslog
- [scorecard] add previous month navigationlog
- [fsm] keep checklist repair batches within limitslog
- [scorecard] show shadow SafetyCulture scoreslog
- [fsm] distinguish multi-roof checklist taskslog
- [scorecard] explain SafetyCulture points on hoverlog
- [fsm] route checklist alerts to app adminlog
- [scorecard] enforce paid scoring evidence gateslog
- [pricing] sub-profile the downstream phase of onOppUpadatelog
- [scorecard] normalize callback COQL watermarklog
- [pricing] replay edits missed during calculationlog
- [scorecard] page callback timeline evidencelog
- [scorecard] preserve callback bootstrap historylog
- [leads] stop proper() case-mangling of Companylog
- [scripts] guard name-casing backfill against downgradeslog
- [scorecard] add fair monthly audit fallbacklog
- [leads] stop " Lead !" placeholder surviving conversionlog
- [scorecard] show provisional scores before eligibilitylog
- [scorecard] show early metric scoreslog
- [scorecard] remove duplicate eligibility warningslog
- [scorecard] sort board by displayed totallog
- [scorecard] publish board on custom domainlog
- [scorecard] publish readable board fileslog
- [scorecard] distinguish audit score sourceslog
- [scorecard] show audit evidence tooltipslog
- [scorecard] keep audit tooltip in viewportlog
- [invoicing] fall back invoice To to Account Emaillog
- [xero] label an HTML-gateway block as transient, not a re-auth alertlog
- [jobhours] retry the attendance pull when the Mac network is downlog
- [jobhours] stop the installer disabling the daily report timerlog
- [jobhours] alert when the daily report fails to sendlog
- [jobhours] email Bailey when a scheduled unit enters failed statelog
- [jobhours] stop the failure alert inverting exit status and restartslog
- [scope] drop valleys from the gutter guard wordinglog
- [fsm] drop a stale add-on line when the add-on leaves the deallog
- [jobhours] alert on failure for every user service, not just ourslog
- [fsm] parenthesise the technician report visibility criterialog
- [fsm] deploy precedence-safe criteria to three technician reportslog
- [fsm] make all six technician Job reports precedence-safe livelog
- [fsm] scope the last three precedence bugs to every branchlog
- [fsm] deploy the last two criteria fixes and guard the whole classlog
- [mr-auto-close] gate the preview on CRM Job_Sub_Stage like Creator doeslog
- [mr-auto-close] stop discarding a blocked Creator validationlog
- [job-hours] make nightly needs-you cards actionablelog
- [mr-auto-close] resolve pending markers and stop reusing completed Taskslog
- [job-hours] ops enter missing hours via CRM placeholder rows (ADR 0081)log
- [creator] make the headless function deploy work for namespaced functionslog
- [fsm] make MR auto-close evidence logic bracket-freelog
- [job-hours] clear needs_review nags when a structured row covers a missing-hours keylog
- [jobhours] re-mint the CRM token on 401 instead of replaying a dead onelog
- [fsm] show checklist history and day lines on the portal pagelog
- [fsm] trim trailing zeros from checklist day-line hourslog
- [fsm] read-only task view with photos on the checklist pagelog
- [fsm] compare the reconciler contract on non-whitespace contentlog
- [fsm] add Billboard image handofflog
- [fsm] isolate deal fallback image groupslog
- [jobhours] bound retries and token refreshlog
- [fsm] check billboard handoff against the job-level pairlog
- [fsm] harden billboard handoff readinesslog
- [jobhours] parallelise callback timeline readslog
- [jobhours] make retry budgets exhaustivelog
- [job-hours] separate persistent report actionslog
- [fsm-canary] scaffold simulator applog
- [fsm-canary] remove subtitle above sectionlog
- [fsm-canary] add durable upload outboxlog
- [fsm-canary] add fixture-scoped Zoho adapter.log
- [fsm-canary] finish simulator feasibility canarylog
- [fsm-canary] compile real Zoho SDK pathlog
- [ops] daily Zoho IAM session canarylog
- [pricing] apply pricing tooltips to CRM, one field per PATCHlog
- [fsm] union tech images with proposal image instead of overridinglog
- [scorecard] show last board update time in the leaderboard headerlog
- [fsm] refresh technician note canary baselinelog
- [job-hours] attendance sync crashed every weekend runlog
- [job-hours] pair checklist activity actors and dateslog
- [scope] hide gutter painting metres on proposalslog
- [maintenance] add technician acknowledgementslog
- [maintenance] match Creator snippet link namelog
- [maintenance] filter reminders after CRM readlog
- [maintenance] make acknowledgement audit idempotentlog
- [zohosign] add email delivery feedbacklog
- [apps-script] install trigger from saved propertieslog
- [maintenance] identify requests in technician smslog
- [maintenance] identify requests in every notificationlog
- [scorecard] mobile card layout and TV density polish for leaderboardlog
- [email-bounce] include Google Admin SMTP reasonlog
- [scope] tile repair default wording says partial clean, not full rooflog
- [job-hours] send daily report with stale banner instead of blockinglog
- [job-hours] Mac-side daily report delivery watcherlog
- [crm] Job Notes & Work Log related list on Dealslog
- [crm] parse Creator dd/MM/yyyy dates explicitly in jobNotesWorkLogRLlog
- [fsm] Daily_Job_Log_All report for office/ops visibilitylog
- [job-hours] stop parser minting phantom hours from customer names, garbled dates, activity wordslog
- [job-hours] reconciler counts Daily Job Log hourslog
- [job-hours] suspect-hours detection in digest, CRM tasks, nightly summarylog
- [crm] clickable rows, all entries, attachment-only notes in jobNotesWorkLogRLlog
- [crm] open note attachments in a new tab from the Deallog
- [crm] split comma-joined multi-file attachment values in jobNotesWorkLogRLlog
- [fsm] Note_Files photo viewer page; Deal list rows open itlog
- [fsm] Note_Files photos render at 420px, not full widthlog
- [crm] photo rows open the note's native Creator lightbox; retire Note_Files pagelog
- [area-pack] last-14-days focus + TanStack chartslog
- [job-hours] guard scoped reparseslog
- [crm] add-note row on Job Notes and Work Loglog
- [crm] actions row gains Add Daily Job Log; open-job moves into itlog
- [crm] Add note opens the crew's Technician_Notes wrapper, not the bare formlog
- [crm] wrapper lookup 400'd on max_records=1log
- [proposal] preserve accepted deal stage on resendlog
- [invoicing] hold drafts unless explicitly releasedlog
- [fsm] restore scoped technician reportslog
- [books] harden Roof Care deposit deliverylog
- [books] block no-recipient invoice releaselog
- [books] enforce explicit invoice release gateslog
- [fsm] restore portal-safe report rollbacklog
- [fsm] defer local Zoho deploy importlog
- [books] preserve live billing safeguardslog
- [proposal] use CRM image uploads as authoritylog
- [proposal] close remaining image reader gapslog
- [campaigns] recover audience sync safelylog
- [related-list] avoid technician notes timeoutlog
- [related-list] escape add-note XML URLlog
- [related-list] open singular technician note formlog
- [gp-sign] replace terminal signature requestslog
- [gp-sign] confirm live request replacementlog
- [fsm] technicians can see touch-up jobs in Active Jobslog
- [fsm] CRM Touchup Required promotes the completed FSM joblog
- [gp-sign] keep client script loader synchronouslog
- [fsm] stamp progress origin on the touch-up transitionlog
- [fsm] block reduced Used volumes on Complete Job resubmitlog
- [fsm] honour administrators in Daily Job Log delete bypasslog
- [crm-digest] route team emails by area matrix, fail closedlog
- [campaigns] add CRM request metrics and field preflightlog
- [campaigns] emit metrics on any failure and report credit deltalog
- [campaigns] keep meta-status stdout pure JSON for the recaplog
- [fsm-canary] complete technician portal setuplog
- [fsm-canary] land simulator feasibility applog
- [tooling] criteria-precedence audit fails loudly on bad path argslog
- [area-pack] closed-opportunity win rate headline with frozen FY26 targetslog
- [area-pack] data layer for open-deal list, pipeline math, intake and loss splitslog
- [area-pack] legible last-year chart linelog
- [area-pack] render the meeting's missing answers on pages and emaillog
- [area-pack] review fixes for pipeline math, intake split, and verify tieslog
- [area-pack] classify legacy Proposal Accepted stage as openlog
- [area-pack] Proposal Accepted counts as won, not openlog
- [sms] route inbound SMS reply mention + forward by deal stagelog
- [scheduling] send customer notifications under the deal's ops manager identitylog
- [prework] resolve ops contact from Operations_Manager, not region hardcodelog
- [area-pack] vendor Leaflet + GeoNames postcode centroids for the map layerlog
- [area-pack] embedded deal/lead maps on the area pages (ADR 0085)log
- [area-pack] map review fixes - cache-buster, init state, popupslog
- [sms] DeGroot alphanumeric sender for one-way SMS pathslog
- [sms] sendTwilioSms From check without redundant parenslog
- [sms] build curly-quote chars via urlDecode, Deluge has no unicode escapeslog
- [roof-care] SMS unsubscribe flips Email_Opt_Out, the system fields are read-onlylog
- [sms-widget] Accounts thread, more numbers, search, From picker, no-reply badgelog
- [sms-widget] explain read-only Account thread instead of asking for a mobilelog
- [sms] STOP opt-out persists for Leads, the unsubscribe system fields are read-onlylog
- [area-pack] retry once on a transient network error in the CRM clientlog
- [sms] SMS_Opt_Out custom field, SMS-only suppressionlog
- [sms] SMS_Opt_Out gate in standalone.sms and the lead dedupe blockerlog
- [crm-digest] retry once on a transient OpenAI timeoutlog
- [mr-billing] completed-MR invoice stage reconciliation on progress-invoice releaselog
- [campaigns] stop double token mints and back off on Zoho's mint throttlelog
- [sales-floor] drop as_of staleness from the rate-card canarylog
- [mr-billing] evidence-backed Monday progress digestlog
- [mr-billing] resolve technician names in digest evidence; honest backlog cap labellog
- [mr-billing] digest review fixes from two-axis reviewlog
- [mr-billing] date-typed Job_Finish cutoff compare (TEXT >= rejected by Deluge)log
- [mr-billing] drop 3-term COQL range from JLA evidence querylog
- [mr-billing] Books send hook executes reconciler via zapikeylog
- [billing] repair Books payment -> deal finance reconcile bridgelog
- [billing] alert on deposit-flag reconcile failure, daily drift sweeplog
- [mr-billing] flag completed jobs with technician notes but no billable hourslog
- [mr-billing] unwrap Creator getRecords data map in missed-hours note checklog
- [job-hours] flag zero-hour field notes nobody else covers in the Daily Job Reviewlog
- [deposit-gate] clear stale deposit state after a void, name the real block reasonlog
- [books] refresh deal deposit state when a deposit invoice is voidedlog
- [job-hours] one-loop fix for zero-hour notes - deterministic placeholder mint + confirmed-zero checkboxlog
- [job-hours] bound the placeholder self-heal scope by the mint work-date floorlog
- [related-list] show auto-synced roof image notes in Job Notes and Work Loglog
- [crm] add Job Review widgetlog
- [job-hours] Missing Hours bulk-entry CRM widget + panel functionlog
- [crm] include thumbnail dependencylog
- [crm] use UTC expiry for Job Reviewlog
- [job-hours] collapse whitespace in Missing Hours panel free textlog
- [crm] install Job Review OAuth transportlog
- [job-hours] resolve Deal and Technician names in the Missing Hours panellog
- [job-hours] date-matched note fallback for legacy rows in Missing Hourslog
- [job-hours] compare legacy note dates as dates, not textlog
- [crm] enlarge Job Review related listlog
- [crm] lift Job Review resize caplog
- [missing-hours] same-day context per row (crew + tech elsewhere)log
- [crm] show names in Job Reviewlog
- [crm] refine Job Review presentationlog
- [missing-hours] add technicians from the tab, adopted by the pipelinelog
- [crm] settle Job Review height on loadlog
- [missing-hours] decimal hours were rejected - Deluge regex literals are rawlog
- [job-hours] normalize spaced decimals so '2 .5' parses and later crew lines survivelog
- [job-hours] watchdog alert failures now fail the unit; report waits for nightlylog
- [job-hours] official-run heartbeat gating + scheduled report bundlelog
- [crm] persist Job Review sort preferenceslog
- [crm] sort Job Review day activitylog
- [job-hours] assert captured overrides same night; guard bare-env pusheslog
- [finance] drop Amanda from overdue invoice finance visibility emailslog
- [fsm-sync] technician compare no longer reports a false change every runlog
- [hooks] pre-push gates the pushed commit, not the working treelog
- [drift-watch] behind-alert names the files that block a fast-forwardlog
- [billing] recon ticks paid flags itself, no reliance on flaky instant workflowlog
- [fsm-checklist] photo evidence required on tile rebedding/repointing taskslog
- [fsm-checklist] backfill reads via OAuth data API, identity by tile Task_Code prefixlog
- [fsm-checklist] staff can act on checklist tasks from any devicelog
- [fsm-checklist] admins count as staff in the checklist gatelog
- [books-sync] keep invoices attached to their deal when the customer changeslog
- [invoicing] name Books contact persons from the record, stop deal guard repointinglog
- [job-hours] own BrightHR attendance acquisition on the VPSlog
- [deposit] block only on real billing changes, not any concurrent writelog
- [crm-digest] compose Minto action briefslog
- [crm-digest] account for every post-send commitlog
- [crm-digest] retry rejected classificationslog
- [crm-digest] allow coverage repair to finishlog
- [invoicing] make the invoice email audit append JSON-safelog
- [crm-digest] reassess malformed classification itemslog
- [crm-digest] broaden recipient email coveragelog
- [crm-digest] isolate Bailey-only review itemslog
- [crm-digest] read legacy team send dateslog
- [Quoting Tool - deploy] auto-deploy main to VPS via GitHub Actions (#519)log
- [Quoting Tool - deploy] accept Tailscale auth key for Actions VPS deploy (#521)log
- [Quoting Tool - raster] resolve surveyId for the TrueOrtho preflight instead of fetching a doomed meta URLlog
- [Quoting Tool - feature-map] surface imagery and parcel load failures in the map instead of the consolelog
- [Quoting Tool - ux] in-app feedback button that files a GitHub issue with a screenshotlog
- [Quoting Tool - raster] skip the TrueOrtho preflight for downgraded imagery and key it on the resolved surveylog
- [Quoting Tool - ux] pair feedback context with its screenshot, pin the destination repo, drop orphan imageslog
- [Quoting Tool - feature-map] drive the imagery notice from the terminal load outcome, not pre-request statelog
- [Quoting Tool - raster] de-export RasterMetaRequestPlan to satisfy the fallow dead-code gatelog
- [Quoting Tool - deploy] wait for the edge before the VPS smoke first requestlog
- [Quoting Tool - feature-map] derive the off-boundary roof exclusion instead of mutating deletedRoofIdslog
- [Quoting Tool - ui] add PostHog analytics integrationlog
- [Quoting Tool - deploy] bake PostHog client env vars into the prod Docker buildlog
- [Quoting Tool - feature-map] route roof-id-keyed consumers through one excluded-roof setlog
- [Quoting Tool - ai-features] validate archive clips against the property library bbox, not the caller supplied onelog
- [Quoting Tool - ui] stop PostHog initialising in tests and crashing dev without a keylog
- [Quoting Tool - ai-features] revalidate memoized archive winners and keep identified empty clipslog
- [Quoting Tool - ui] record PostHog analyze and image-upload events only when they happenlog
- [Quoting Tool - ui] keep handleAnalyzeWithAI under the fallow complexity floorlog
- [Quoting Tool - ui] populate solarPanelCount and make EWP emittablelog
- [Quoting Tool - ui] stop counting an injected manual detection twicelog
- [Quoting Tool - ui] close HeightSafetyChip after EWP rebase mergelog
- [Quoting Tool - ui] tighten AI archive-fallback bbox neighbour guardlog
- [Quoting Tool - ui] reject provenance-mismatched AI archive clipslog
- [Quoting Tool - ui] fall back to Google satellite where Nearmap has no coveragelog
- [Quoting Tool - ui] do not infer no-coverage from local-only surveyslog
- [Quoting Tool - deploy] log the undici cause behind a bare 'fetch failed' (#577)log
- [Quoting Tool - ui] commit preview tile generations by minting tile-scheme frames (#580)log
- [Quoting Tool - raster] resolve local survey raster for networked preview-mode properties (#582)log
- [Quoting Tool - ui] guard the Vert probe setter against same-value update loops (#584)log
- [Quoting Tool - ui] scope offline status to the active property address (#588)log
- [Quoting Tool - data] default the store off the code tree (#593)log
- [Quoting Tool - raster] bounded-drift acceptance for identity-scoped verified sidecars (#589)log
- [Quoting Tool - ui] rework split tool — polyline ribbon cut, multi-surface commit, visible Enter commit (#592)log
- [Quoting Tool - raster] degrade the local survey branch to preview instead of wedging (#587)log
- [Quoting Tool - raster] resolve local survey raster for networked preview-mode properties (#591)log
- [Quoting Tool - ui] key the pointing detection effect on work, not object identity (#597)log
- [Quoting Tool - ui] correct TAS travel routing and deep-link kickoff holdlog
- [Quoting Tool - ui] hide Offline Library status card while the property loading screen is uplog
- [Quoting Tool - ui] clamp split-tool cursor pill to canvas and hide when pointer leaveslog
- [Quoting Tool - server] supervised ai-features provenance backfill scriptlog
- [Quoting Tool - ui] make roof labels stable identities across delete and splitlog
- [Quoting Tool - ui] auto-exclude sliver AI roof detections under 8 m²log
- [Quoting Tool - ui] give the sidebar one restore control instead of twolog
- [Quoting Tool - ui] stop duplicating the focus-area CTAs in the empty statelog
- [Quoting Tool - ui] stop the autosave chip showing a previous session's clock timelog
- [Quoting Tool - ui] stop label freeze from overwriting hydrated roof nameslog
- [Quoting Tool - ui] include boundary spill dismissal in session undolog
- [Quoting Tool - server] type the backfill meta read with NearmapArtifactArchiveMetaV1log
- [Quoting Tool - server] never long-cache a failed upstream tile-preview responselog
- [Quoting Tool - server] correct backfill store root and link-before-stamp orderinglog
- [Quoting Tool - ui] free a removed synthetic roof's stored labellog
- [Quoting Tool - ui] address review findings on the roof-map UX batchlog
- [Quoting Tool - server] fleet-scale --from-library mode for the ai-features provenance backfilllog
- [Quoting Tool - server] reject header-extent bbox, collapse address-variant claimantslog
- [Quoting Tool - ui] run provenance backfill CLI under node - / cjs bundlelog
- [Quoting Tool - server] exact-equality variant collapse and bounded-batch memorylog
- [Quoting Tool - server] route backfill index enumeration through the read seamlog
- [Quoting Tool - ui] keep excluded clips in ai-features archive indexlog
- [Quoting Tool - server] treat only ENOENT as a cacheable sidecar factlog
- [Quoting Tool - ui] exclude unpaintable roof surfaceslog
- [Quoting Tool - ui] reset split tool after commitlog
- [Quoting Tool - ui] clarify Nearmap survey costslog
- [Quoting Tool - ops] add no-spend key rotation runbooklog
- [Quoting Tool - ui] keep survey cost labels inside the date popoverlog
- [Quoting Tool - ui] merge boundary controlslog
- [Quoting Tool - ui] show cached raster gallery without tokenlog
- [Quoting Tool - ui] satisfy survey cost quality gatelog
- [Quoting Tool - ui] harden abutment cutting-in matchinglog
- [Quoting Tool - ui] capture authoritative classification decisionslog
- [Quoting Tool - ui] clarify roof accent pairinglog
- [Quoting Tool - ui] drop active synthetic fill when another roof is hoveredlog
- [Quoting Tool - ui] highlight manual roofs from cardslog
- [Quoting Tool - ui] read material-section metadata from faceslog
- [Quoting Tool - ui] hide raster fetch without authorizationlog
- [Quoting Tool - ui] make credential invalidation atomiclog
- [Quoting Tool - ui] upgrade Gemini vision model to 3.7 Flash with per-site thinking levelslog
- [Quoting Tool - ui] keep dark-surface button labels readable in dark modelog
- [Quoting Tool - ui] replace undefined --slate-100 on dark-surface button labelslog
- [Quoting Tool - ui] repair dropped backgrounds and low-contrast button labelslog
- [Quoting Tool - coverage] carry the survey's offered raster types to the clientlog
- [Quoting Tool - nearmap] quote a survey's credit cost without spendinglog
- [Quoting Tool - ui] replace the blocking spend confirm with a quote dialoglog
- [Quoting Tool - coverage] retry a local-only miss without the AOI polygonlog
- [Quoting Tool - raster] summarise gallery sections and collapse the historylog
- [Quoting Tool - pricing] let only the product name ellipsize in a narrow chiplog
- [Quoting Tool - ui] settle superseded spend prompts and gate the quote by requestlog
- [Quoting Tool - hygiene] email unlanded work reportslog
- [Quoting Tool - hygiene] keep cleanup leftovers out of weekly emaillog
- [Quoting Tool - hygiene] refresh landing provenancelog
- [Quoting Tool - hygiene] retain uncertainty detailslog
- [Quoting Tool - ui] close imagery date list after steppinglog
- [Quoting Tool - deploy] redact dry-run command detailslog
- [Quoting Tool - ui] preserve focus while stepping imagerylog
- [Quoting Tool - ui] make raster lifecycle a single ownerlog
- [Quoting Tool - ui] close offline archive runtime seam gapslog
- [Quoting Tool - ui] close issues 621-625 review gapslog
- [Quoting Tool - ui] keep exports on committed raster frameslog
- [Quoting Tool - ui] prefer settled export imagery when commit is nulllog
- [Quoting Tool - ui] keep export imagery and decoded tiles atomiclog
- [Quoting Tool - ui] stabilize Coverage Session actionslog
- [Quoting Tool - roi] use the canonical area helper for Google footprint candidateslog
- [Quoting Tool - feature-map] stabilise handleExportMeasurementDetails identitylog
- [Quoting Tool - raster] hoist RasterGallery early return above the hooks it skippedlog
- [Quoting Tool - pricing] show the engine re-screw price on the Full Re-screw chiplog
- [Quoting Tool - scripts] anchor lead workspace to DATA_ROOT, drop in-repo out/ fallbacklog
- [Quoting Tool - feature-map] use the canonical typing guard for panel shortcutslog
- [Quoting Tool - photos] key the metadata memory cache the same way on both pathslog
- [Quoting Tool - property-library] compare the availability-cache identity through one keylog
- [Quoting Tool - feature-map] de-export the internal ProjectionCounters typelog
- [Quoting Tool - pricing] default the re-screw chip price instead of branching on itlog
- [Quoting Tool - photos] never key metadata cache on NaN coordinateslog
- [Quoting Tool - harvest] de-export the internal bundle credit config typelog
- [Quoting Tool - ui] drop unused harvest area-band importlog
- [Quoting Tool - ui] keep closed rings closed on endpoint vertex draglog
- [Quoting Tool - harvest] strict full-bundle predicate for badge and spend guardlog
- [Quoting Tool - ui] add React Grab dev pickerlog
- [Quoting Tool - ui] move react-grab to devDependencieslog
- [Client-Onboarding-Guide - admin] add DELETE /api/admin/forms/:dealId to wipe a stored draftlog
- [Client-Onboarding-Guide - submit] ride the completed tag on the deal-update PUT to stop duplicate deposit invoiceslog
- [fsm] auto-complete inactive maintenance requestslog
- [fsm] use typed Creator deal identifierlog
- [fsm] default maintenance automation actorlog
- [pricing] heal solar cleaning qty stickiness and quote-accepted notifylog
- [pricing] freeze gutter cleaning Opp_Products as billable snapshotlog
- [pricing] sync gutter LM formulas and GG field mapslog
- [campaigns] add trust-first SMS pilot modelog
- [pricing] reconcile live lead-compliance exclusion into the quote-lock snapshotlog
- [scheduling] catch up jobs a missed monthly fire strandedlog
- [scheduling] never mail an approval link the ledger did not savelog
- [scheduling] write the ledger via crm.set, not the REST variables PUTlog
- [travel] bound flexible scheduling discount by actual travellog
- [pricing] add per-deal flexible scheduling opt-outlog
- [pricing] preserve final HSF product synclog
- [pricing] generate tile replacements per rooflog
- [pricing] recalculate locked product totals from inputslog
- [pricing] preserve locked roof snapshotlog
- [scheduling] add shadow approval pilotlog
- [scheduling] preserve initial September snapshotlog
- [scheduling] hide in-progress jobs from pilotlog
- [scheduling] add live approval and send pilotlog
- [fsm] add rollback mode to touch-up criteria writerlog
- [scheduling] allow pre-send approval undolog
- [scheduling] roll approval cycles forwardlog
- [scheduling] block stale approval widgetslog
- [outreach] make open task suppression non-bypassablelog
- [scheduling] open approvals to active CRM userslog
- [scheduling] allow Jamey to send approvalslog
- [Quoting Tool - pricing] load live oppConsts and stop Kliplok pricing at 1.0log
- [Quoting Tool - pricing] match live CRM paint calculationslog
- [Quoting Tool - crm] persist height safety adjustmentslog
- [Quoting Tool - crm] preserve height safety adjustmentslog
- [Quoting Tool - crm] block pushes without live pricing contextlog
- [Quoting Tool - ui] make the height safety fee editable by linear metrelog
- [Quoting Tool - ui] use runtime-resolvable height safety importlog
- [Quoting Tool - ui] bill edge protection on the dissolved roof boundarylog
- [Quoting Tool - ui] fall back when roof perimeter dissolve is incompletelog
- [Quoting Tool - ui] dissolve EP perimeter across separately priced roof cardslog
- [Quoting Tool - ui] unify the danger classifier and make the storey trigger livelog
- [Quoting Tool - ui] honor operator floors and ignore height for dangerlog
- [Quoting Tool - ui] default tile repair scopelog
- [Quoting Tool - ui] compare EagleEye and CRM pricinglog
- [Quoting Tool - ui] parent roof material sectionslog
- [Quoting Tool - ui] add roof boundary edge tagslog
- [Quoting Tool - ui] derive edge protection from boundary tagslog
- [Quoting Tool - ui] finish edge protection section controlslog
- [Quoting Tool - ui] integrate per-edge gable controlslog
- [Quoting Tool - ui] reprice roof alternates from current snapshotlog
- [Quoting Tool - ui] preserve alternate edge authoritylog
- [Quoting Tool - ui] preserve alternate gable and abutment authoritylog
- [Quoting Tool - ui] require section confirmation before Zoho pushlog
- [Quoting Tool - ui] correct section confirmation integrationlog
- [Quoting Tool - ui] keep quote comparison handler privatelog
- [Quoting Tool - ui] close quote integration review gapslog
Week of 03 August 2026 48 changes
- Technicians and mobile users will now be directed to the checklist page, with checklist actions limited to the appropriate profiles. The mobile view puts open tasks first, keeps completed tasks available, and shows technicians only the task details needed on site. Open a job in FSM mobile and select the Job Checklist area.
- When sending a proposal for signature, it now routes through the active Opportunity owner and keeps the CRM record aligned with the signature request. The send button also gives clearer outcomes so you can tell whether the request was sent or needs attention. Open a general painting Opportunity and use the proposal signature button.
- Job details now include clearer checklist progress, Daily Job Log history, and refreshed labour and material summaries based on active logs. Existing locked job details, notes, timestamps, and attachments remain available. Open a job in FSM desktop and review the Job Details, checklist, or Daily Job Log sections.
- Job detail records now show refreshed labour and material usage summaries, along with checklist progress and Daily Job Log history. Open a job in FSM desktop and review the Job Details area.
- The quoting tool now handles shared imagery surveys more reliably, reducing the risk of a raster image hang and preferring the newest usable high-quality imagery when several surveys are available. Visible when opening a property and switching imagery surveys in the quoting tool.
- [job-hours] tolerate identical BrightHR clocking overlaplog
- [fsm] route all mobile users to checklist pagelog
- [fsm] restrict mobile checklist actions by profilelog
- [fsm] make mobile profile gate unambiguouslog
- [job-hours] deliver manager digest to teamlog
- [job-hours] show Blip hours in coveragelog
- [gp-sign] send requests as deal ownerlog
- [fsm] remove obsolete job menu actionslog
- [gp-sign] harden owner routing and auditlog
- [sales-floor] rate-card v3 — gated publish, labour_per_onsite_hr, cm_target_pctlog
- [sales-floor] canary asserts card values, heartbeat and code-3 tripwirelog
- [pricing] floorless target-anchored quote margin enginelog
- [crm] Job Economics widget goes floorless — verdict vs target onlylog
- [gp-sign] send through logged-in deal ownerlog
- [daily-log] finish native grid canary packagelog
- [scorecard] add SafetyCulture shadow metriclog
- [gp-sign] clarify button send outcomeslog
- [fsm] gate and reconcile mobile checklistlog
- [job-hours] report edge protection evidencelog
- [daily-log] preserve live prefill compatibilitylog
- [gp-sign] send through logged-in deal ownerlog
- [gp-sign] clarify button send outcomeslog
- [fsm] move closed checklist tasks lastlog
- [fsm] simplify technician task detailslog
- [fsm] allow mobile ops managers to update checklistslog
- [pricing] reapply accepted Amount within tolerancelog
- [campaigns] daily CRM flag projection + Bendigo 50-120km ring audiencelog
- [campaigns] unify trade + GP-lead exclusions across all audienceslog
- [fsm] add daily log usage rollupslog
- [fsm] preserve locked job detail fieldslog
- [fsm] keep daily log scope within Creator limitslog
- [fsm] use delete cancellation in log guardlog
- [Quoting Tool - ui] repair invalid type tokens, orphan vars, and contrast fails from UI-system auditlog
- [Quoting Tool - ui] color foundation — ramps, role tokens, green consolidation (#499)log
- [Quoting Tool - ui] single solid Analyze-with-AI CTA per screen (#500)log
- [Quoting Tool - ui] lightness-matched roof palette + grayscale-safe pairing chip (#502)log
- [Quoting Tool - test] stabilize server test networking and CI gates (#487)log
- [Quoting Tool - test] settle background offline-status refresh before nearmapUsageTracker temp-root cleanuplog
- [Quoting Tool - ui] two campaign-tail contrast regressions found by the DoD sweeplog
- [Quoting Tool - ui] target-anchored available-discount surface (uniform economics)log
- [Quoting Tool - ui] address PR-512 review — prod-guard prototype hooks, bump sync-cache schemalog
- [Quoting Tool - ui] stop survey-wide raster hang on shared Nearmap surveyslog
- [Quoting Tool - ui] prefer property-library TrueOrtho over stale Vert-only surveys (#514)log
Week of 27 July 2026 261 changes
- The quoting tool now makes it easier to move between imagery surveys and view types, with the newest local imagery selected by default. You can choose another survey, fetch available imagery after confirmation, and see which capture supplied the AI details. In the quoting tool map, use the imagery date stepper and the imagery gallery.
- Technicians can now use the mobile job checklist with clearer task actions, progress, and navigation back to the checklist. Use the checklist on the job to record completed, not applicable, or unable-to-complete tasks and add required evidence. In FSM mobile, open the Job Checklist from the job or Daily Job Log.
- The Daily Job Log now keeps technician and job details aligned, limits technician choices to the job crew, and can take you directly to outstanding checklist tasks after submission. Technicians should use the Daily Job Log for the daily record, then complete any open checklist items. In FSM mobile, open the Daily Job Log from the job.
- Proposals now carry the available roof images through the online and signed proposal paths. General Painting quote signing also checks the customer's mobile number and confirms email and SMS delivery. In the CRM proposal record and the customer signing process.
- Compliance reminders have changed from daily alerts to a weekly Monday digest, grouped by technician and course, with links to the records needing attention. Admin and operations staff should use the weekly digest to review overdue items, upcoming expiries, and compliance gaps. In the compliance email digest and Compliance Records in the CRM.
- [area-pack] act on the independent review findingslog
- [job-hours] send Bailey the manager digestlog
- [payments] correct Xero payment monitor alertslog
- [area-pack] follow-up compliance is Proposal Sent onlylog
- [area-pack] five changes from the 2026-07-29 sales meetinglog
- [area-pack] follow-up compliance is Proposal Sent onlylog
- [area-pack] five changes from the 2026-07-29 sales meetinglog
- [job-hours] require work evidence for JSA alertslog
- [area-pack] split stale pipeline out of the open-pipeline figurelog
- [area-pack] split stale pipeline out of the open-pipeline figurelog
- [area-pack] act on PR review — owner table, FY26 targets, stale tooltiplog
- [area-pack] act on PR review — owner table, FY26 targets, stale tooltiplog
- [crm] add Deal JSA evidence related listlog
- [area-pack] prospects counts each enquiry once, not twicelog
- [area-pack] prospects counts each enquiry once, not twicelog
- [area-pack] upsell attach rates measured against eligible dealslog
- [area-pack] upsell attach rates measured against eligible dealslog
- [area-pack] upsell targets from last year's attach ratelog
- [area-pack] upsell targets from last year's attach ratelog
- [area-pack] year-ago comparison on every windowed rowlog
- [area-pack] year-ago comparison on every windowed rowlog
- [proposal] render all roof imageslog
- [area-pack] rank misses by dollars, one fact per columnlog
- [proposal] use embeddable roof image URLslog
- [area-pack] round count targets up to whole unitslog
- [area-pack] four colour bands from one rule, and two colour bugslog
- [area-pack] skim-first redesign, one definitions block, gaps not percentslog
- [fsm] allow create after zero-match lookuplog
- [fsm] harden job creation recoverylog
- [fsm] repair partial function createslog
- [fsm] satisfy telemetry return contractlog
- [fsm] verify canonical live readbacklog
- [sign] enforce GP quote email and SMSlog
- [billing] gate jobs on verified deposit deliverylog
- [validation] handle blank deposit statuslog
- [scorecard] technician monthly prize engine, snapshot schema, leaderboard (ADR 0075)log
- [fsm-images] roof-scoped rebuildable technician image synclog
- [scorecard] measurement hardening — surveys split, source health, variation budgets (ADR 0075 amendment)log
- [scorecard] shed-TV legibility — explicit dark theme, distance-readable typelog
- [scorecard] survive real CRM — COQL pagination, deal GET pathlog
- [scorecard] eligibility floor 12 -> 10 worked dayslog
- [scorecard] package-style invocation for the VPS runnerlog
- [invoicing] prevent duplicate referral discountlog
- [vps] deploy from a clean git-archive export, never the working treelog
- [proposal] personalize referral discountlog
- [vps] scorecard units in installer whitelist + tailnet leaderboard serverlog
- [proposal] preserve generic discount authoritylog
- [proposal] match referral copy amountlog
- [scorecard] legacy note timeliness — metric live before Daily Job Log shipslog
- [scorecard] grade-5 crew-facing wording + crew handout draftlog
- [scorecard] clearer numbers — max in headers, totals out of 100, crew naminglog
- [scorecard] referral capture via CRM Referred_By — the field admin actually useslog
- [scorecard] Mello Systems port — three WIP ideas for Russ/Jameylog
- [scorecard] DeGroot-branded leaderboard — red banner, Montserrat, charcoallog
- [daily-job-log] hide inactive technicianslog
- [scorecard] Team VIC vs TAS strip — eligible-only averages, bragging rights (Q30-Q33)log
- [scorecard] 5x20 restructure — reviews+surveys merged, equal weightslog
- [scorecard] named reviews mint double — crew share survives naming (Q35-Q37)log
- [daily-job-log] scope technician choices to job crewlog
- [daily-job-log] resolve assigned technician recordslog
- [daily-job-log] retain lookup ids for crew scopelog
- [daily-job-log] scope newly added labour rowslog
- [pricing] enforce single referral benefitlog
- [pricing] accept legacy referral roundinglog
- [daily-job-log] redirect to job checklist after addlog
- [daily-job-log] backport material cleanup workflowlog
- [daily-job-log] preserve technician on editlog
- [job-hours] require named daily-log canarylog
- [job-hours] reconcile stale-base worktree with structured runtimelog
- [daily-job-log] child-report transport for structured-log pulllog
- [daily-job-log] hide Parent_Log_ID from the technician gridlog
- [presentations] reset screen-fit transform in print CSSlog
- [daily-job-log] force portal document navigationlog
- [daily-job-log] use Creator submitter identitylog
- [fsm] force checklist document navigationlog
- [fsm] add mobile portal checklistlog
- [fsm] preserve checklist authorization scopelog
- [fsm] align checklist page componentlog
- [fsm] match Creator page signaturelog
- [fsm] keep page authorization scalarlog
- [fsm] only show task photo uploader when Photo_Requiredlog
- [fsm] bind checklist page actionslog
- [fsm] lock Task_Category against technician editslog
- [fsm] pass checklist action argumentslog
- [fsm] keep native-app checklist and daily-log navigation in-applog
- [fsm] make mobile checklist actions reliablelog
- [fsm] escape checklist issue labellog
- [fsm] make mobile checklist navigation reliable and quiet the task cardslog
- [crm-digest] personalise daily digest per recipient arealog
- [compliance] weekly compliance digest replaces daily alertlog
- [compliance] bulk group-training recorderlog
- [fsm] self-heal duplicate managed tech-note buckets in syncAttachmentsToFSMlog
- [fsm] branch technote canary breach guidance by pair sourcelog
- [fsm] sync FSM.dg mirror with live phone ladder + retired cancel stublog
- [Quoting Tool - ui] expose coverage request key headerlog
- [Quoting Tool - client] gate prefetched AI seeds by provenancelog
- [Quoting Tool - feature-map] preserve canvas DPR for boundary hitslog
- [Quoting Tool - zoho] filter retired rows from quote scopelog
- [Quoting Tool - ui] serve cached raster tiles without spend confirmationlog
- [Quoting Tool - ui] harden raster spend prompt against review findings on #451log
- [Quoting Tool - ui] stop reporting local-only AI checks as confirmed unavailablelog
- [Quoting Tool - commercial-crm] add explicit legacy Property baseline bootstrap workflowlog
- [Quoting Tool - commercial-crm] execute safe existing-Property imports through Modulelog
- [Quoting Tool - coverage] stop fragile ai-check cache matching from discarding real answerslog
- [Quoting Tool - pricing] add .js extensions to server-reachable ESM importslog
- [Quoting Tool - session] persist selected imagery surveylog
- [Quoting Tool - ui] select default imagery survey by rasterlog
- [Quoting Tool - survey] decouple AI capture from imagerylog
- [Quoting Tool - feature-map] show AI capture provenance chiplog
- [Quoting Tool - ui] add survey date stepperlog
- [Quoting Tool - feature-map] add survey switch choreography seamslog
- [Quoting Tool - ui] integrate newest imagery survey stepperlog
- [Quoting Tool - ui] harden imagery survey switchinglog
- [Quoting Tool - ui] close imagery selection raceslog
- [Quoting Tool - ui] unblock settled survey generationslog
- [Quoting Tool - ui] retain raster publication readinesslog
- [Quoting Tool - ui] traverse survey raster fallbackslog
- [Quoting Tool - ui] resolve warm-bound raster switcheslog
- [Quoting Tool - ui] settle local survey raster targetslog
- [Quoting Tool - ui] commit loaded raster fallbackslog
- [Quoting Tool - ui] persist resolved AI survey contextlog
- [Quoting Tool - coverage] rank AI-scoped ai-check cache entries above imagery-onlylog
- [Quoting Tool - ui] quote panel copy, addable chips, and visible push-gate reasonlog
- [Quoting Tool - ui] map toolbar status/control semantics and status-row cleanuplog
- [Quoting Tool - ui] roof card condition CTA and AI-details disclosurelog
- [Quoting Tool - ui] street view save-bar hierarchy and readable AI coverage chiplog
- [Quoting Tool - ui] stop overlays swallowing clicks on Push to Zoholog
- [Quoting Tool - pricing] restore 35-degree danger rule; power-line overhang is Dangerouslog
- [Quoting Tool - ui] link roof cards to map polygons; deterministic order; quote progresslog
- [Quoting Tool - ui] 'Restore removed roofs' - the count was AI feature ids, not roofslog
- [Quoting Tool - server] kill-switch for /api/property-listing, disabled by defaultlog
- [Quoting Tool - ui] AI Analysis notes move into the AI details disclosurelog
- [Quoting Tool - ui] per-roof 'Street View saved' chip on roof cardslog
- [Quoting Tool - ui] boundary-spill nudge - one-click exclude of neighbour roofslog
- [Quoting Tool - ui] roof delete no longer gated on window.confirmlog
- [Quoting Tool - ui] map-chrome declutter - one imagery cluster in the date stepperlog
- [Quoting Tool - ui] view chips inline on the stepper bar - zero-popover switchinglog
- [Quoting Tool - ui] frame-meta 'error' no longer pins cached gallery tiles invisiblelog
- [Quoting Tool - ui] raster gallery becomes an owned-imagery inventorylog
- [Quoting Tool - ui] gallery mask toggles apply to every survey sectionlog
- [Quoting Tool - ui] header AI chip stops claiming 'No AI' from imagery-only snapshotslog
- [Quoting Tool - ui] one-click 'Run AI condition' CTA on unconditioned roof cardslog
- [Quoting Tool - review] address Codex P2s and CI fallow gate on PR #483log
- [Quoting Tool - ui] material sections inherit parent hazards; purge PR-483 orphaned CSSlog
- [Quoting Tool - ui] migrate address search to Places API Newlog
- [Quoting Tool - ui] cancel stale place selectionslog
- The CRM's FSM mismatch checks have changed how touch-up jobs and linked jobs are handled. Matching touch-up records are no longer raised as unnecessary mismatches, while genuine touch-up link or stage problems remain visible for follow-up. CRM job records and the FSM mismatch digest.
- Payment reconciliation checks have been strengthened so each payment is matched to the correct invoice and confirmed before the system reports success. This reduces the risk of invoices being marked paid from an incorrect or shared payment reference. Zoho Books and the CRM payment and invoice records.
- [pricing] sales floor rate-card sync + freshness canary (#194)log
- [pricing] shadow Sales Bottom Dollar engine + Deal fields (#195)log
- [pricing] VPS-portable rate-card drift check (#194 Stage 5)log
- [pricing] preserve products until roofs are approvedlog
- [pricing] sales guardrail backtest + go-live gates (#196)log
- [pricing] reconcile sales floor cost model to division P&L (v2)log
- [pricing] below-floor [QUOTE-OM] approval loop, inert (#199)log
- [pricing] sales-floor warn-banner client script + bridge, inert (#200)log
- [job-hours] add Daily Job Log V1 contract seamlog
- [daily-log] add transactional reconciliation storelog
- [job-hours] plan Daily Log CRM metadatalog
- [daily-job-log] add Creator V1 source packagelog
- [daily-job-log] correct technician edit windowlog
- [daily-log] preserve removed reconciliation statelog
- [daily-job-log] preserve Creator correction authoritylog
- [daily-log] project canonical labour provenancelog
- [job-hours] reconcile Daily Log materialslog
- [job-hours] integrate Daily Job Log nightlylog
- [job-hours] fail closed on missing Daily Log reportlog
- [job-hours] report canonical daily-log truthlog
- [job-hours] harden daily-log runtime gateslog
- [vps] gate daily-log shadow schema preplog
- [job-hours] scope shadow economics refreshlog
- [job-hours] ignore inactive catalog historylog
- [job-hours] freeze unproven daily-log authoritylog
- [job-hours] expose daily-log operations signalslog
- [job-hours] mark empty coverage not applicablelog
- [job-hours] scope runtime drift authoritylog
- [job-hours] attest empty pulls and hour thresholdslog
- [job-hours] retain fresh report shape authoritylog
- [job-hours] require live source authoritylog
- [job-hours] generate Creator warning thresholdlog
- [job-hours] seal retained report authoritylog
- [job-hours] validate hidden report rowslog
- [job-hours] revoke stale report authoritylog
- [job-hours] revoke shape drift before metadatalog
- [job-hours] revoke raw shape drift before decodelog
- [job-hours] reject malformed report parentslog
- [sales-floor] assert Sheet row labels before reading the rate cardlog
- [sales-floor] re-point Sheet rows after the Inputs memo insertlog
- [sales-floor] make the VPS drift check update its own checkoutlog
- [job-hours] restore the folded material stage's window, visibility and orderlog
- [job-hours] make rollback safe and hold the labour write on reverse-sync failurelog
- [job-hours] make Daily Job Log source writes order-independentlog
- [job-hours] carry the real work date into material reconciliationlog
- [job-hours] stop the Daily Job Log checker reporting unproven evidence as greenlog
- [daily-job-log] give every Deluge authoring rule a negative testlog
- [daily-job-log] realign the Complete Job prefill Deluge with its authoritylog
- [daily-job-log] gate the manifest file lists against what is on disklog
- [job-hours] stop the daily-log path emptying the nightly emaillog
- [job-hours] read Creator's no-records 404 without trusting every 404log
- [job-hours] route labour desired-state consumers through the canonical seamlog
- [job-hours] make push-labour --emit-deletes fail loudly instead of no-oppinglog
- [job-hours] align the labour content hash with what is actually projectedlog
- [job-hours] keep raw Creator link names inside the adapterlog
- [job-hours] make Material_Usage identity resolvable and hold honestlylog
- [job-hours] make the manual material rollback tool write againlog
- [job-hours] label the 06:00 report's material litres honestlylog
- [job-hours] do not request Daily Job Log CRM fields before they existlog
- [job-hours] do not write Daily Job Log CRM fields before they existlog
- [job-hours] gate CRM provenance on schema, not on feature modelog
- [fsm] suppress aligned touch-up alertslog
- [fsm] exclude touch-ups from mismatch digestlog
- [payments] harden Xero Books reconciliationlog
- [fsm] heal blank reciprocal job linkslog
- [fsm] restore touch-up identity checkslog
- [job-hours] restore Bailey-only daily reportlog
- [job-hours] resolve report regions from source datalog
- [job-hours] suppress covered continuation warningslog
- [job-hours] require labour evidence for JSA alertslog
- [job-hours] exclude office staff from attendancelog
- [Quoting Tool - test] restore Vitest default excludeslog
- [Quoting Tool - data] keep the lead workspace and dev store off the code treelog
- [Quoting Tool - search] merge recent-search identity aliaseslog
- [Quoting Tool - crm] protect commercial property importslog
- [Quoting Tool - smoke] verify browser key in built assetslog
- [Quoting Tool - search] keep the recent-search read path alive when the rewrite cannot persistlog
- [Quoting Tool - hygiene] block worktree removal on gitignored data, and fail closed on a truncated PR listlog
- [Quoting Tool - scripts] realpath the entry path before the import.meta.url comparisonlog
- [Quoting Tool - scripts] accept both entry-path forms in the entrypoint guardlog
- [Quoting Tool - hygiene] delete merged branches with -D after proving containment in origin/mainlog
- [Quoting Tool - smoke] salvage the Google API smoke harness, spend-gated (#386)log
- [Quoting Tool - backup] stop a passing restore drill from exiting 1 on its own cleanup (#389)log
- [Quoting Tool - raster] preserve torn-write cache invalidationlog
- [Quoting Tool - nearmap] strengthen shared artifact URL validationlog
- [Quoting Tool - harvest] gate Nearmap artifact egresslog
- [Quoting Tool - nearmap] gate orchestrated artifact egresslog
- [Quoting Tool - raster] make frame source ranking exhaustivelog
- [Quoting Tool - raster] brand generation axeslog
- [Quoting Tool - routes] add coverage session storelog
- [Quoting Tool - raster] isolate warmup generation flightslog
- [Quoting Tool - raster] centralize raster ledger eventslog
- [Quoting Tool - routes] stabilize coverage session snapshotslog
- [Quoting Tool - raster] scope frame overrides by propertylog
- [Quoting Tool - raster] scope gallery frame metadata keyslog
- [Quoting Tool - routes] derive coverage request identitylog
- [Quoting Tool - raster] scope settled frames to sessionlog
- [Quoting Tool - routes] mint client property identitylog
- [Quoting Tool - server] configure offline archive sinkslog
- [Quoting Tool - server] keep library tile sink unconfiguredlog
- [Quoting Tool - server] observe raster persistence outcomeslog
- [Quoting Tool - nearmap] retry raster artifact fetcheslog
- [Quoting Tool - pricing] share travel duration modellog
- [Quoting Tool - pricing] remove unreachable base-rate fallbackslog
- [ColourConfidence - deps] clear high-severity advisories in the production treelog
- [ColourConfidence - ci] pin the react-doctor workflow's actions to commit SHAslog
- [crm-digest] preview-before-team review window + self-service opt-outlog
- [crm-digest] control container runs as bailey; drop losing traefik prioritylog
Week of 20 July 2026 113 changes
- Cancelled and terminal jobs are now retained for history, while CRM and FSM stages continue to be reconciled. Cancelled jobs are kept out of technician calendars and reports where appropriate, but remain available for admin review. You'll see the retained job history and updated stages on the Opportunity and FSM job records.
- The CRM now checks Australian phone numbers before sending them to FSM. Invalid numbers are held for an owner task instead of being saved incorrectly. Review phone corrections from the relevant Lead, Contact, Client, or Technician record.
- The quoting tool's roof imagery analysis has changed to improve roof condition, segmentation, masking, and pointing results. You may notice different analysis results when reviewing a property. Use the Roof Map and its AI analysis tools in the quoting tool.
- The quoting tool has changed how AI detection and imagery loading are handled, reducing loading freezes and showing clearer errors when an analysis cannot be read. Property searches and background imagery updates should also remain responsive while loading. You'll notice this in Property View, the Roof Map, and AI analysis screens in the quoting tool.
- When measuring a roof, the quoting tool now guides you through choosing or drawing a focus area before AI analysis. The measurements panel shows the available choices, spend details, and options to analyse, adjust, or reset the selected area. Open a property in the quoting tool and use the Roof Map measurements panel.
- [books] handle omitted Xero allocation fieldslog
- [books] use xero invoice update endpointlog
- [invoicing] add guarded INV-001783 recoverylog
- [invoicing] use Books address IDs for recovery draftlog
- [fsm] respect active CRM job substageslog
- [fsm] retain cancelled job historylog
- [fsm] retain and sync terminal cancellationslog
- [fsm] add read-only mismatch forensic auditlog
- [fsm] complete mismatch evidence readslog
- [fsm] accept empty forensic COQL readslog
- [fsm] emit JSON-safe forensic evidencelog
- [fsm] accept populated forensic COQL rowslog
- [fsm] format terminal sync timestamplog
- [fsm] stamp terminal sync in CRMlog
- [fsm] use CRM readback time for sync stamplog
- [fsm] inventory duplicate attachment signatureslog
- [fsm] prevent duplicate job creationlog
- [fsm] preserve intentional duplicate historylog
- [fsm] report aligned cancellations as no-opslog
- [fsm] preserve legacy job-create stage guardlog
- [fsm] retry partial terminal cancellationslog
- [fsm] gate cleanup apply by approved manifestlog
- [fsm] use Creator record assignment in apply guardlog
- [fsm] keep touch-up jobs flag-onlylog
- [job-hours] migrate services-needed deal contextlog
- [job-hours] recover partial crew allocationslog
- [job-hours] resolve contextual crew ambiguitieslog
- [fsm] enforce Australian phone contractlog
- [job-hours] restore material sync monitoringlog
- [fsm] link lead phone tasks correctlylog
- [fsm] land terminal sync cleanuplog
- [Quoting Tool - ai] migrate Gemini vision flows to 3.6 Flashlog
- [Quoting Tool - ai] keep segmentation types internallog
- [Quoting Tool - ai] satisfy Gemini vision quality gatelog
- [Quoting Tool - ui] prevent AI detection loading freezeslog
- [Quoting Tool - ui] satisfy AI freeze quality gateslog
- [Quoting Tool - ui] guided focus-area flow with spotlight, inline ROI, and tier trimlog
- [Quoting Tool - ui] address focus-area review and CIlog
- When entering or editing an Opp address, you can now choose a Google address suggestion to fill the street, suburb, state, and postcode. Use the address flyout when it appears, rather than typing each part separately. On the Opportunity create, edit, and detail pages in the address fields.
- Phone numbers in job and technician records have been corrected so tapping a phone number from the mobile FSM record summary now opens the phone dialler correctly. In FSM job, client, and technician record summaries.
- The quoting tool now keeps the roof areas identified by aerial imagery when you select a polygon area, so measurements and quote areas are less likely to change unexpectedly. In the quoting tool's property measurement and quote workspace after selecting a polygon area.
- [quotes] auto-calculate services quote callout from addresslog
- [haymes] retry invoice twin convergencelog
- [quotes] address autocomplete + auto callout + shared gutter LM on Services Quote Roof Carelog
- [roof-care] bias address autocomplete toward central VIClog
- [quotes] minimal one-screen redesign of Services Quote widgetlog
- [quotes] in-card quantity inputs + strict one-line addresslog
- [quotes] native Deal address autocomplete (client script + backend)log
- [fsm] normalize AU phone numbers to E.164 at CRM->Creator boundarylog
- [fsm] phone-format guardrails — form self-heal, daily canary, repo auditlog
- [quotes] flyout address autocomplete over the native Deal formlog
- [invoicing] freeze issued deposit invoiceslog
- [invoicing] freeze post-verify mismatch holdslog
- [invoicing] prevent draft invoice repurposinglog
- [payments] preserve Xero payment dateslog
- [books] propagate voided invoices to xerolog
- [crm] Deal address autocomplete flyout on DETAIL page inline editslog
- [Quoting Tool - ui] preserve AI areas for polygon AOIlog
- When reviewing material billing, you can now exclude rework items from billing while keeping Haymes rebate handling separate. Reviewed invoice line sets are also preserved during supplier reprocessing. On the relevant Opportunity material billing and invoice records.
- The Send to FSM button now creates missing touch-up jobs correctly, including Opportunities marked Touchup Required. Use the button as normal when sending these jobs to FSM. On the Opportunity record, using the Send to FSM button.
- Positive replies to inbound SMS now go to the current Opportunity owner, with Bailey only receiving exceptions. This should make follow-up tasks and notifications reach the right person. In CRM Tasks and notifications created from inbound SMS replies.
- When an Opportunity reaches a completed stage, its linked FSM job can now be reconciled to Job Completed. The system also provides a clearer dry-run view of the proposed CRM, FSM, and checklist changes before any records or emails are changed. On completed Opportunity and FSM job records, and in the stale-job reconciliation review.
- The three-month declined quote follow-up has changed to a guarded, auditable email process. Customers with other accepted work are excluded, and the message is personalised to the service. In the CRM's declined Opportunity follow-up process.
- You can now create a Services Quote from a Contact using a guided widget, enter the service details, and copy the customer offer link. Services Quotes are clearly labelled and support one-off services such as gutter cleaning, solar work, pressure cleaning, and gutter guard. On the Contact detail screen, in the Services Quote widget.
- Accepted one-time Services Quotes now create child jobs with a clear [Service Quote] name instead of the annual Winter Care label. Annual acceptances continue to use the Winter Care name. In the Opportunity and FSM job names created from a Services Quote.
- Quoted services now flow through operations with the correct technician teams, service history, safety requirements, invoice labels, and job templates. Annual checklists and SWMS requirements are based on the services selected in the quote. On accepted Services Quote Opportunities, FSM jobs, checklists, and related invoices.
- [tooling] rules-as-code pull script + live Deals workflow-rule snapshot (#133)log
- [invoicing] separate Haymes billing from rebateslog
- [fsm] create missing touch-up jobslog
- [invoicing] surface blocked weekly progress draftslog
- [invoicing] route Books email through operations managerslog
- [invoicing] populate progress cost centreslog
- [sms] route positive replies to deal ownerlog
- [fsm] reconcile CRM terminal stageslog
- [fsm] describe dry-run reconciliation effectslog
- [automation] guard declined quote re-engagementlog
- [invoicing] retry completed weekly progress draftslog
- [invoicing] centralise MR budget ledgerlog
- [invoicing] reconcile MR budget snapshotslog
- [portal] report canonical MR budget usagelog
- [tooling] cache MR schema OAuth tokenlog
- [invoicing] wire MR fingerprint field IDslog
- [tooling] verify delayed MR transfer readbacklog
- [haymes] link adjustment notes to parent documentslog
- [haymes] preserve live MR refresh guardslog
- [quotes] services quote stub button riding Roof Care offer stacklog
- [roof-care] survive missing attachments.READ scope in accept evidence phaselog
- [haymes] use requested monthly spend labellog
- [invoicing] align MR preview fingerprintslog
- [roof-care] neutral Services Quote presentation for SVCQ stubslog
- [roof-care] name SVCQ one-time children [Service Quote]log
- [quotes] services quote widget replaces stub-edit flowlog
- [haymes] cascade parent Deal to adjustmentslog
- [roof-care] define Services Quote Roof Care source flowlog
- [roof-care] lock accepted scope and require evidence readbacklog
- [roof-care] route quoted services through operationslog
- [fsm] honor quoted Roof Care service scopelog
- [roof-care] close quote scope integrity gapslog
- [roof-care] add operator maintenance gatelog
- [roof-care] verify layout picklist schemalog
- [roof-care] make legacy migration fail closedlog
- The stale job alert now focuses on jobs waiting for a technician to call the client, rather than mixing in job creation and pre-booking alerts. The supporting entry time is kept for CRM administrators and is hidden from technician and other non-admin forms and reports. You'll see the change in the FSM stale-job digest and the Technician to Call Client workflow.
- [fsm] narrow stale alert to technician callslog
- [fsm] use session auth for Creator backfilllog
- [fsm] reuse CRM token during backfilllog
- [fsm] restrict technician-call timestamp to adminslog
- [fsm] use Creator admin helper for field visibilitylog
- [fsm] enforce timestamp access through profileslog
Week of 13 July 2026 175 changes
- Roof Care offer pages now show the customer's street address, use a personalised winter introduction, and have clearer plan selection and page transitions. Staff should expect the offer page to look different when reviewing a customer's options. Customer Roof Care offer pages.
- The CRM now flags accepted Opportunities that have not been booked after 30 days, helping the team follow up before they go stale. FSM stale-job notifications and the accepted pre-booking stages.
- The quoting tool now supports signing in with Zoho, with CRM actions performed under the signed-in user's access. Staff will see clearer sign-in and connection checks, including options to log out or disconnect Zoho when needed. The quoting tool sign-in page and the account settings area.
- The quoting tool now shows your name and sign-in provider, with Logout available from the settings dropdown. Zoho users will also see Disconnect Zoho there. The gear settings dropdown in the quoting tool.
- The ColourConfidence image workflow has changed to make anonymous uploads safer and to provide clearer handling when an upload or preview cannot be completed. Customers may notice changes to the image upload and preview steps. The ColourConfidence image upload, colour selection, and results screens.
- ColourConfidence now keeps transparent PNG backgrounds looking white when images are processed, so roof images should display more naturally. ColourConfidence image upload and results screens.
- [roof-care] retire submission deadline gatinglog
- [roof-care] survey thank-you email wave (Loom video + $100 credit)log
- [roof-care] survey thank-you copy final (benefit-led, winners-announced hero)log
- [roof-care] street address on offer page, personalised winter introlog
- [roof-care] invert plan toggle active state to solid brand redlog
- [roof-care] motion polish on offer page (audit findings 1-5)log
- [job-hours] deploy from checked-out treelog
- [fsm] flag accepted jobs never bookedlog
- [report] flag stale in-progress jobslog
- [Quoting Tool - auth] SessionPrincipal seam + req.principal + session regeneration on loginlog
- [Quoting Tool - auth] encrypted per-user Zoho credential vault (AES-256-GCM envelopes)log
- [Quoting Tool - auth] static machine bearer tokens for dev-reader hydration, e2e, and VPS smokelog
- [Quoting Tool - zoho] delegated CRM client factory + property-context tracer routelog
- [Quoting Tool - audit] per-user append-only JSONL audit log for spend + CRM mutationslog
- [Quoting Tool - auth] Sign in with Zoho — start/callback flow, PKCE+state, org-gate policy, login pagelog
- [Quoting Tool - zoho] convert zohoSync READ routes + preflight helpers to delegated client (batch 1)log
- [Quoting Tool - harvest] admin role gates + delegated Phase-0 CRM reads (batch 4)log
- [Quoting Tool - zoho] convert deal WRITE subtree to delegated client (batch 2)log
- [Quoting Tool - auth] daily session revalidation + logout vs Disconnect Zoho + session headerlog
- [Quoting Tool - auth] login/OAuth rate limits + CORS origin allowlistlog
- [Quoting Tool - zoho] convert attachments + image-field/Files uploads to delegated client (batch 3)log
- [Quoting Tool - zoho] contract step — SERVICE-TOKEN ONLY quarantine, CI import gate, ADR 0009, glossarylog
- [Quoting Tool - auth] resolve org id via GET /crm/v2/org — CurrentUser carries no org fieldlog
- [Quoting Tool - auth] outbound Zoho fetch timeouts + fallow gate cleanup (PR #287 review)log
- [Quoting Tool - auth] requireRole honors the test/E2E auth bypass (CI test job)log
- [Quoting Tool - auth] callback accounts-server allowlist + JSON content-type parity + disconnect-before-revalidationlog
- [Quoting Tool - ui] session header shows account + Logout for every signed-in sessionlog
- [Quoting Tool - ui] move session controls into the settings dropdownlog
- [Quoting Tool - smoke] machine-token probe must pass offline-status's required address paramlog
- [ColourConfidence - security] harden anonymous image workflowlog
- [ColourConfidence - upload] cap native image resize timelog
- [ColourConfidence - upload] preserve transparent PNG backgroundslog
- You can now view a customer's sent and received SMS history and compose SMS messages from the CRM. The composer shows the sender number before sending, while existing SMS Notes and reply handling remain unchanged. On an Opp, Lead, or Contact, open the SMS conversation widget or use the conversation button on the Opp detail screen.
- Inbound STOP replies now keep the customer's SMS suppression status on their record, so future messages remain blocked as intended. Contact records also receive the email opt-out status where applicable. On the customer's Contact or Lead record, check the communication opt-out fields.
- The Roof Care customer pages have been refined with shorter copy, clearer reservation steps, improved referral presentation, branded terms, and a fallback image when a personalised image cannot load. Customers will see a cleaner reservation and guide experience. On the Roof Care offer, reservation confirmation, terms, and customer guide pages.
- Roof Care customers now receive redesigned confirmation emails after reserving and after their deposit is received. The emails show the next steps, referral information, payment status, and signed terms in the updated layout. In the customer email inbox after a Roof Care reservation or deposit payment.
- The system no longer creates routine empty “Proposal Opened” notes, and the existing engagement fields continue to track proposal activity. The old duplicate notes have also been removed, so Opp Notes should be less cluttered. In the Notes and proposal engagement areas of an Opp.
- Pre-work and booking-nudge tracking now uses dedicated fields instead of routine status notes. Staff should continue using the existing forms and workflows, while actionable warning and failure notes remain available. On Opps and Leads, check the Pre-work and Booking Nudge fields and the remaining actionable Notes.
- When a technician submits field evidence or completes a checklist task, eligible jobs will now move to Job In Progress automatically. Jobs moved forward from an earlier unbooked stage also notify the ops manager, and the daily notes report identifies these automatic advances. In FSM job stages, ops manager notifications, and the daily notes report.
- Ops managers will now receive a daily digest for Opportunities that have remained in Job Created for more than 14 days, until they move forward. In the ops manager email inbox.
- The daily CRM digest now includes per-update and month-to-date change counts, with a link to a searchable changelog. Team members can opt out of the email and use the changelog instead. In the daily CRM digest email and the linked changelog page.
- You can now filter the change summary by project, using clearer team-facing names such as the CRM and the quoting tool. The summary layout and week ordering have also been refined to make recent updates easier to browse. On the change summary page, use the project filter buttons above the update list.
- [crm-digest] line-count stats on changelog and emailslog
- [crm-digest] changelog motion polish (plans 001+002)log
- [crm-digest] filter buttons follow repos.json orderlog
- [crm-digest] backfill --days 0 covers full repo historylog
- [crm-digest] project filter + team-facing project labelslog
- [crm-digest] never send team email via the admin@ relaylog
- [crm-digest] surface work volume for non-technical readerslog
- [crm-digest] track EagleEye, PayrollPilot, onboarding, ColourConfidencelog
- [crm-digest] team changelog site + email opt-out and countslog
- [fsm] daily nag for jobs unaccepted after 14 dayslog
- [fsm] auto-advance jobs to In Progress on field evidencelog
- [crm-digest] daily staff-facing CRM change digest from VPSlog
- [job-hours] route nightly mail through n8n relaylog
- [maintenance] normalise CRM user phones safelylog
- [maintenance] use CRM users connectionlog
- [maintenance] use scoped CRM user connectionlog
- [maintenance] configure notification identitieslog
- [job-hours] link notes through Creator report detaillog
- [pricing] preserve on-hold deal quantitieslog
- [job-hours] use manager Creator note linkslog
- [maintenance] preserve actual job forecastlog
- [maintenance] hide internal CRM referencelog
- [maintenance] preserve submitted job detailslog
- [job-hours] flag corrections and photo noteslog
- [maintenance] move request confirmation to CRMlog
- [job-hours] link report warnings to jobslog
- [job-hours] split daily report by regionlog
- [crm-digest] surface work volume for non-technical readerslog
- [crm-digest] never send team email via the admin@ relaylog
- [crm-digest] project filter + team-facing project labelslog
- [crm-digest] backfill --days 0 covers full repo historylog
- [crm-digest] filter buttons follow repos.json orderlog
- [crm-digest] changelog motion polish (plans 001+002)log
- [crm-digest] line-count stats on changelog and emailslog
- [crm-digest] line stats big-picture only, not per daylog
- [job-hours] disable admin mail relaylog
- [job-hours] remove admin relay transportlog
- [crm-digest] weekly changelog sections in chronological orderlog
- [mail] send automations as Bailey onlylog
- [mail] run CRM digest with Gmail API dependencieslog
- [crm-digest] newest week first on the changeloglog
- [mail] send through Bailey personal Gmail aliaslog
- [crm-digest] spell out 'lines of code' in volume linelog
- [mail] inherit Bailey Gmail signaturelog
- [fsm] harden job completion flowlog
- [automation] prevent CRM Books identity duplicateslog
- [fsm] replace obsolete SWMS completion gatelog
- [automation] remove phone suffixes from CRM nameslog
- [job-hours] automate Blip attendance anchorlog
- [job-hours] add attendance note coveragelog
- [job-hours] refine daily notes reportlog
- [Quoting Tool - tooling] complete feedback-loop hardeninglog
- [Quoting Tool - tooling] harden pre-commit process spawninglog
- [Quoting Tool - shared] use explicit .js extension in roi-geometry importlog
- [Quoting Tool - raster] harden alignment acceptance gateslog
- [Quoting Tool - ui] use raster imagery public surfacelog
- [Quoting Tool - raster] classify alignment confidencelog
- [Quoting Tool - raster] add offline corpus georef backfilllog
- [PayrollPilot - payroll] require exact id match when override carries employee idlog
- [PayrollPilot - integrations] add scoped BrightHR payroll ingest (#112)log
- [job-hours] add daily job notes reportlog
- [automation] notify ops when jobs are cancelledlog
- [re-enquiry] require verified external eventslog
- [pre-work] surface completion statuslog
- [Quoting Tool - raster] bind tile identity to georeferencelog
- [Quoting Tool - raster] preserve corrected georef versionslog
- [Quoting Tool - raster] persist immutable georef v2 recordslog
- [Quoting Tool - raster] close late generation review gapslog
- [Quoting Tool - cadastre] preserve multipart parcel topologylog
- [Quoting Tool - measurements] harden malformed geometry handlinglog
- [Quoting Tool - measurements] unify area semantics and roof surface displaylog
- [Quoting Tool - street-view] persist framing across workspace tabslog
- [Quoting Tool - feature-map] stop shortcuts while typinglog
- [Quoting Tool - raster] finalize generation acceptancelog
- [Quoting Tool - raster] complete atomic worker publicationlog
- [email-bounce] make bounce processing idempotentlog
- [fsm-repair] refresh cohort API tokenslog
- [fsm-repair] guard complete active-job migrationlog
- [fsm] hide estimated days from technicianslog
- [commercial-mr] require complete property addresseslog
- [fsm-sync] preserve CRM job times and property addresseslog
- [mr] put room before location in maintenance request nameslog
- [haymes] add guarded line colour backfilllog
- [haymes] add gated builder colour backfilllog
- [haymes] preserve structured portal colour datalog
- [haymes] add structured colour fieldslog
- [Quoting Tool - raster] commit generations atomicallylog
- [Quoting Tool - feature-map] bind raster frames to loaded tileslog
- [Quoting Tool - feature-map] warm Vert frame key at loadlog
- [Quoting Tool - scripts] default the alignment tools to the dev API port 5176log
- [Quoting Tool - feature-map] clear the Vert seed race timer once the meta promise settleslog
- [Quoting Tool - feature-map] export SettledRasterFrameCache via the rasterImagery indexlog
- [Quoting Tool - scripts+e2e] raster-toggle choreography spec + isolated fresh-vs-cached Nearmap comparisonlog
- [Quoting Tool - feature-map] hold tile-canvas pixels through empty-raster generation paintslog
- [Quoting Tool - feature-map] paint switched raster types at their settled frame (no coverage-bbox interim)log
- [Quoting Tool - feature-map] log exact camera + drawn tile frame for alignment auditslog
- [Quoting Tool - scripts] image-geo alignment audit + content registration probelog
- [Quoting Tool - raster] derive survey-scale frames on first serve via coverage-scale pixelSize fallbacklog
- [PayrollPilot - ui] preserve payroll dates and downloadslog
- [PayrollPilot - react] resolve doctor diagnosticslog
- [Client-Onboarding-Guide - doctor] resolve all React Doctor findingslog
- [ColourConfidence - upload] guard preview lifecyclelog
- [ColourConfidence - react] resolve doctor cleanup findingslog
- [proposal] improve flexible scheduling fallbacklog
- [operations] accept CRM update metadata responseslog
- [operations] add Tasmania leave coverage toolinglog
- [Quoting Tool - raster] tolerate explicit null index bucket in collectRefPropertyIdslog
- [Quoting Tool - raster] derive warm-time pixel metadata from coverage scale so scoped tiles self-alignlog
- [Quoting Tool - feature-map] never close shared tile bitmaps; guard setImagesVersion after unmountlog
- [Quoting Tool - ui] settle secondary-panel image loads on decode, not onloadlog
- [Quoting Tool - feature-map] decode tiles off the main thread via fetch + createImageBitmaplog
- [Quoting Tool - feature-map] perf telemetry via PerformanceObserver + engine cleanuplog
- [Quoting Tool - feature-map] overscan the tile canvas so pan/zoom reveals pixels, not backgroundlog
- [PayrollPilot - payroll] isolate review overrides by employee idlog
- [PayrollPilot - notifications] add final timesheet email settingslog
- [PayrollPilot - payroll] add shared non-blocking reviewlog
- [PayrollPilot - payroll] guarantee normalized support breaklog
- [PayrollPilot - payroll] correct support break calculationslog
- [ColourConfidence] address PR #32 bot review findingslog
- [ColourConfidence - server] constrain scheme output filenameslog
- [ColourConfidence - server] preserve upload filename validationlog
- [ColourConfidence - types] reuse canonical project typelog
- [ColourConfidence - server] centralize route error handlinglog
- [ColourConfidence - drafts] canonicalize color scheme persistencelog
- [ColourConfidence - surfaces] centralize shared vocabularylog
- [ColourConfidence - status] add typed processing contractlog
- [ColourConfidence - server] centralize upload path resolutionlog
Week of 06 July 2026 151 changes
- [Quoting Tool - feature-map] clear tile CSS transform immediately when a fresh worker frame is adoptedlog
- [Quoting Tool - feature-map] hold map reveal until the raster frame is final (alignment snap)log
- [Quoting Tool - feature-map] session-identity settle must not wipe the scene; camera choke-point logginglog
- [Quoting Tool - feature-map] identity settling must not re-arm the single-fit latch; add __eeFitLog breadcrumblog
- [Quoting Tool - feature-map] seed prefetched AI on first render; reveal rides the expected roof fitlog
- [Quoting Tool - feature-map] hold map reveal until the auto-fit stream settleslog
- [Quoting Tool - feature-map] resize refit follows camera mode; crossfade only on generation swaplog
- [Quoting Tool - feature-map] address PR #248 review findingslog
- [PayrollPilot - deploy] ship workbook-layout.json in runtime image (PR #86 review)log
- [PayrollPilot - notifications] make approval-email recipients env-configurable (#17)log
- [Client-Onboarding-Guide - review] harden Sydney date-part guard; type grant-code network failurelog
- [Quoting Tool - feature-map] stop manual->ai transition re-arming the single fit (#244)log
- [Quoting Tool - feature-map] consolidate load-time chrome into a status cluster (#246)log
- [Quoting Tool - raster] warm-path preview skip + fresh-path crossfade (#245)log
- [Quoting Tool - street-view] harden frame realm + capture validation (PR #222 review)log
- [Quoting Tool - ui] address round 6 review findingslog
- [Quoting Tool - cadastre] preserve selected TAS endpointlog
- [Quoting Tool - pricing] align chip GST display roundinglog
- [Quoting Tool - client] route RasterGallery frame-meta fetch through the single-flight coalescer (#218)log
- [Quoting Tool - zoho] keep dealPricingContext live under the sync cache (PR #216 review)log
- [Quoting Tool - client] never cache the zoho/sync error-fallback body (PR #216 review)log
- [Quoting Tool] address PR #198 review + boundary testlog
- [PayrollPilot - edit-analysis] fail fast when dump-xlsx.py missing from standalone installlog
- [PayrollPilot - edit-analysis] review feedback — timeouts, tz-safe age filter, container uidlog
- [PayrollPilot - engine] never auto-fill an employee whose shifts were excluded as anomalouslog
- [PayrollPilot - edit-analysis] weekly VPS sweep cron with email alertslog
- [PayrollPilot - engine] auto-fill standard hours for salaried Support stafflog
- [PayrollPilot - engine] exclude the whole employee-day when any shift is anomalouslog
- [PayrollPilot - edit-analysis] review feedback — synthetic first pair, path guard, date formatslog
- [PayrollPilot - engine] exclude multi-day and implausible shifts from daily hourslog
- [PayrollPilot - edit-analysis] runs.json generator + pruning-proof engine-xlsx baselinelog
- [ColourConfidence - submit-lead] reject traversal-shaped imageFilename, drop full-body PII loglog
- [ColourConfidence] address PR review findings (bot reviewers)log
- [ColourConfidence - server] stop re-throwing after response in global error handler (#11)log
- [notes] move pre-work + booking-nudge machine state to fieldslog
- [roof-care] fall back from broken guide herolog
- [proposal] retire Proposal Opened engagement noteslog
- [fsm] native duplicate canary + notes clutter digest scheduleslog
- [roof-care] refine offer hierarchylog
- [sms] add Deal conversation buttonlog
- [sms] show resolved sender in composerlog
- [roof-care] branded reservation + paid confirmation emailslog
- [fsm] image-field dedup uses File_Name__s; add technote dedup backfilllog
- [sms] add conversation composerlog
- [crm] weekly in-CRM self-heal for stage probability driftlog
- [fsm] dedup attachment sync by normalized filename across runslog
- [roof-care] redesign reservation confirmation screenlog
- [roof-care] serve deGroot faviconlog
- [roof-care] cut three more copy lines per Baileylog
- [briefing] weekly stage-probability drift checklog
- [roof-care] branded HTML terms page, signed bytes at /terms.mdlog
- [roof-care] trim offer page copy + broken personal hero fallbacklog
- [sms] persist inbound stop suppressionlog
- [crm] zero Probability on 992 lost-stage deals stamped under old mappingslog
- [fsm] deprecate legacy Auto Add Tech Notes on-add importerlog
- [roof-care] require final send authorizationlog
- [roof-care] bind waiver and staff canarieslog
- [sms] verify embedded CRM viewerlog
- [sms] allow active staff profilelog
- [sms] add inbound conversation historylog
- [roof-care] align pilot guidance and report entitlementlog
- [sms] preserve multiline Twilio outputlog
- [sms] unwrap Zoho widget user responselog
- [sms] add live customer history widgetlog
- [roof-care] bridge Books payment callbacklog
- [roof-care] preserve terms file typelog
- [roof-care] use live CRM attachment connectionlog
- [roof-care] declare payment note iteratorlog
- [roof-care] declare SMS note iteratorlog
- [roof-care] compile SMS note scanlog
- [roof-care] harden launch payment and messaginglog
- [roof-care] add fail-closed campaign smslog
- [roof-care] enforce signed offer contractlog
- [roof-care] gate activation on paid depositlog
- [briefing] roof care unpaid-provisional check + revive dead deposit-unpaid checklog
- [fsm] book maintenance request jobs by defaultlog
- [Quoting Tool - server] revalidate memo winner + coalesce cold scans (#192)log
- [Quoting Tool - server] prefer provenance-matching ai-features archive clips (#192) (#196)log
- [Quoting Tool - ui] fetch zoho/sync once after deal state settles (#193) (#194)log
- [Quoting Tool - ui] move harvest property context to sqlite (#190)log
- [roof-care] extend launch deadlinelog
- [sms] @mention deal owner on inbound reply + capture declined dealslog
- [mr] allow unknown request locationlog
- [mr] ignore placeholder room nameslog
- [mr] harden client portal job creationlog
- [automation] stop false tech-sync alerts from COQL laglog
- [pricing] add shed wall paint modelog
- [Quoting Tool - ui] address PR #181 review (total inflight caches + quotes) (#182)log
- [Quoting Tool - ui] avoid stale empty property index cachelog
- [Quoting Tool - ui] repair issue 178 offline testslog
- [Quoting Tool - ui] repair offline test failures for CI gatelog
- [Quoting Tool - architecture] address round five review findingslog
- [fsm] Roof Care checklist generator and backfilllog
- [fsm] parenthesize portal job report criteria in FSM.dglog
- [automation] lowercase technician email on CRM→Creator synclog
- [Quoting Tool - cadastre] address PR review findingslog
- [Quoting Tool - scripts] centralize data root and gate survey mintlog
- [Quoting Tool - library] harden search entry refreshlog
- [Quoting Tool - library] persist search entries in sqlitelog
- [Quoting Tool - harvest] document tokenless resume ceilingslog
- [Quoting Tool - ui] harden harvest spend run gateslog
- [Quoting Tool - ui] enforce confirmed mask feature tokenslog
- [Quoting Tool - ui] remove unused coverage adapter portslog
- [Quoting Tool - ui] propagate harvest context load failureslog
- [Quoting Tool - ui] harden harvest spend run gateslog
- [Quoting Tool - harvest] preserve tokenless resume coveragelog
- [Quoting Tool - round4] address PR review robustness commentslog
- [paint-engine] seed settings and dark readerlog
- [haymes] rebate classifier catches S/Shld Solashield abbreviationlog
- [job-hours] guard gp_backtest's morning_briefing import for VPSlog
- [job-hours] apply_decisions — ambiguity verdicts become overrides/retractionslog
- [job-hours] #63 ambiguity review — durable module + streamlit pickerlog
- [haymes] Material_Type owns the job-costing gate (ADR 0062)log
- [job-hours] Sam contractor gets real CRM Technician recordlog
- [job-hours] #61 aliases adopted + #62 rejected + #63 review artifactlog
- [job-hours] ADOPT date-aware resolution — holdout confirmed (#60, #61)log
- [job-hours] date-picker column in verify UI, prefilled per notelog
- [job-hours] Window audit mode in verify UIlog
- [job-hours] correct 10 Sam misresolutions + test window preservationlog
- [job-hours] identity rebuild preserves BrightHR windows + add Sam contractorlog
- [haymes] Actual_Paint_Price single-writer (ADR 0061)log
- [contacts] copier-aware collision survey (--deep timeline pass)log
- [contacts] account-contact collision guards + fleet surveylog
- [job-hours] deterministic seed cleanups in the verify UIlog
- [job-hours] hours-LLM validation hardening — prefilter, parity bundle, gated deduplog
- [bookings] fold returning-customer context into open RE-ENQUIRY tasklog
- [re-enquiry] single notification per re-enquiry — warp-proof LED idempotency + delegate rule copieslog
- [job-hours] jake/jacob name equivalence + save-time employment-window blocklog
- [job-hours] date-aware tech disambiguation — resolver windows, UI hints, gold auditlog
- [PayrollPilot - runs] verify payroll file availability (#74)log
- [PayrollPilot - dashboard] show generated payroll outputs (#73)log
- [job-hours] verify UI edit-guard + gold validation gatelog
- [job-hours] undo-last-save in hours-gold verify UIlog
- [job-hours] verify UI speed pass — full-width table, one-click accept, paginglog
- [job-hours] verify UI defaults to frozen gold sample + full note on openlog
- [job-hours] bootstrap adoption gate + holdout confirmation (ADR 0056 §8, #62)log
- [Quoting Tool - ui] add paid-data read-through hydrationlog
- [Quoting Tool - scripts] scrub archive meta credentialslog
- [Quoting Tool - backup] add alerting and restore drillslog
- [PayrollPilot] address bot review findings on tooling PRlog
- [PayrollPilot - analysis] add edit-analysis loop scriptslog
- [PayrollPilot - staff] guard NaN in number field display valuelog
- [PayrollPilot] address review follow-ups from zod4/vite8 PRs (#62, #63)log
- [PayrollPilot - payroll] reject configured pay periods that are not exactly 7 dayslog
- [PayrollPilot - golden] keep time precision for non-header datetime cells in dumplog
- [PayrollPilot - payroll] anchor workbook dates to configured run pay periodlog
- [PayrollPilot - admin] align banner helper with review feedbacklog
- [PayrollPilot - admin] match SMS test banner to backend routinglog
- [PayrollPilot - admin] expose SMS test routing statelog
- [PayrollPilot - sheets] support Shared Drive permissionslog
- [PayrollPilot - sheets] place payroll spreadsheets in Drive folderlog
Week of 29 June 2026 161 changes
- [Quoting Tool - review] harden dev-reader logs and restic unitslog
- [Quoting Tool - review] address paid-data PR commentslog
- [Quoting Tool - auth] add dev-reader allowlistlog
- [Quoting Tool - dev] default to spend-locked keyless bootlog
- [Quoting Tool - archive] redact apikey by parameter namelog
- [Quoting Tool - scripts] add reconciliation manifest generatorlog
- [Quoting Tool - ops] arm restic backup scaffoldlog
- [Quoting Tool - shared] add .js extension to geo-area import for Node ESM runtimelog
- [job-hours] hours-gold verify UI for labelling + holdout (#55, #56)log
- [job-hours] OpenAI pre-label runner for hours gold (#54)log
- [resync] direction-aware drift-gate (type-norm + COSMETIC/REPO_AHEAD buckets)log
- [job-hours] hours gold-set foundation + eval gate + first-lever toolinglog
- [repo] import 242 live-only CRM functions + reusable import toollog
- [pricing] migrate Commercial Flat pitch values to Flat + Commercial_Residentiallog
- [client-scripts] treat Commercial_Residential as a pricing inputlog
- [roof-care] honor Commercial_Residential in cohort + slope resolutionlog
- [pricing] commercial/residential effective-pitch substitutionlog
- [roof-care] webhook ops_alert branch, idempotent finalize, renewal stamplog
- [roof-care] pre-wave hardening of the offer applog
- [roof-care] retire stale 30 June date + supersede launch-pack copylog
- [roof-care] reviews line + referral seed in campaign emailslog
- [Quoting Tool - property-load] address review feedbacklog
- [Quoting Tool - server] cache failed property listing lookupslog
- [Quoting Tool - harvest] guard roi hydration lifecycle transitionslog
- [Quoting Tool - property-library] add sqlite index storelog
- [Quoting Tool - feature-map] exit roof edit against editable parent-draft faceslog
- [Quoting Tool - round3] address fallow and review findingslog
- [Quoting Tool - quote-push] show finalized quote stalenesslog
- [Quoting Tool - crm] honor skip harvest sync in batcheslog
- [Quoting Tool - repo] untrack ui/node_modules symlink and harden the ignore patternlog
- [Quoting Tool - raster] trust world-file frames within a modeled centre envelopelog
- [Quoting Tool - server] read spend-guarded fetch off globalThis per calllog
- [Quoting Tool - feature-map] stop scene reset render looplog
- [PayrollPilot - sheets] neutralize formula injection from uploaded payroll data (#54)log
- [PayrollPilot - auth] address review feedback on admin login flowlog
- [PayrollPilot - security] require admin token for Socket.IO connectionslog
- [PayrollPilot - sheets] gate cleanup of failed sheet publisheslog
- [PayrollPilot - auth] stop seeding admin token cookie to public visitorslog
- [PayrollPilot - approval] preserve concurrent approval state on completionlog
- [PayrollPilot - approval] accept valid jwt approval links before persistencelog
- [PayrollPilot - python] add validate engine tracerlog
- [PayrollPilot - payroll] add file result contractlog
- [PayrollPilot - shared] centralize payroll vocabularylog
- [PayrollPilot - client] use typed processing stageslog
- [PayrollPilot - server] add run progress reporterlog
- [PayrollPilot - shared] add processing stats parserlog
- [PayrollPilot - socket] add typed processing eventslog
- [PayrollPilot - deploy] keep vite config out of production bundlelog
- [PayrollPilot - deploy] avoid vite runtime dependencylog
- [PayrollPilot - deploy] support vps postgres runtimelog
- [ColourConfidence - images] retry transient OpenAI edit failureslog
- [ColourConfidence - deploy] pass maps key into docker buildlog
- [Quoting Tool - ui] gate 3d survey pitch readslog
- [Quoting Tool - ui] wire cache-only source agreement chipslog
- [Quoting Tool - feature-map] seed OSM roof draftslog
- [Quoting Tool - pricing] show quote margin headroomlog
- [Quoting Tool - quote] persist quote descriptorslog
- [PayrollPilot - deploy] add Hostinger VPS deployment supportlog
- [Quoting Tool - raster] harden world file frame trustlog
- [Quoting Tool - shared] add phase 1 pricing primitiveslog
- [Quoting Tool - preship] address PR review feedbacklog
- [Quoting Tool - preship] harden EagleEye ship blockerslog
- [Quoting Tool - ui] harden survey diagnostics formattinglog
- [Quoting Tool - ui] hide survey diagnostics behind debuggerlog
- [Quoting Tool - ui] align FeatureMap raster maskinglog
- [Quoting Tool - ui] use panel Street View for Gemini evidencelog
- [Quoting Tool - ui] settle raster export readinesslog
- [fsm] add reopen action safeguardslog
- [fsm] pass selected job to reopen actionlog
- [fsm] align reopen report action sourcelog
- [fsm] align reopen popup deploy sourcelog
- [fsm] pass job record to reopen redirectslog
- [roof-care] take the $249 deposit on one-off visits toolog
- [fsm] add completed job reopen actionlog
- [roof-care] publish V5 roof care guide PDF (12pp dark-cover)log
- [button] add EagleEye deal deep linklog
- [job-hours] nightly Blip capacity soft-flag (cross-deal over-breach, surfaced not held)log
- [job-hours] cmd_prep mirror-divergence log uses int countslog
- [job-hours] LLM accuracy hardening — context-enrichment infra + writer guardrailslog
- [invoicing] prevent progress draft overlap rebillinglog
- [job-hours] tighten LLM response schema with deterministic boundslog
- [roof-care] clear survey-credit flag on use (one-time thank-you credit)log
- [outreach] remove invalid task COQL fieldlog
- [roof-care] auto-flag future surveys for the thank-you credit via CRM fieldlog
- [outreach] add overdue task reminderslog
- [roof-care] drive thank-you credit from the survey export, not a date proxylog
- [roof-care] gate auto thank-you credit on Closing_Date >= 2026-04-01log
- [roof-care] auto-derive thank-you credit from deal Survey_Responselog
- [job-hours] backfill extract — pass real model + skip LLM-confirmed-empty noteslog
- [roof-care] $100 thank-you credit (signed coupon, net Amount + $149 deposit)log
- [roof-care] mint a signed $100 thank-you credit on offer links (gen_access_link --credit)log
- [roof-care] 5-star/survey thank-you presentation slide (1280x720)log
- [ops] add Haymes price mirror health checklog
- [job-hours] default Gemini model for backfill pushlog
- [pricing] price commercial Kliplok heat paintlog
- [portal] gate MR budget tracker by portal keylog
- [job-hours] add NetStar archive toolinglog
- [zoho-bugs] add local event bridgelog
- [cadences] add sales follow-up automationslog
- [roof-care] correct singular/plural + clearer wording in the guide year markerlog
- [roof-care] unique cleaning-method photo + stronger hero overlay for readabilitylog
- [roof-care] drop 'new' from guide hero, lift the offer CTA, quiet the PDF linklog
- [roof-care] guide headline from PDF, de-dup the intro cards, add Download PDF buttonlog
- [roof-care] residential cover photo for the non-personalised guidelog
- [roof-care] use the large white deGroot mark (no 'Roof Painting') on both headerslog
- [roof-care] white-tile colour logo on both headers; constrain guide header to content widthlog
- [roof-care] lower reserve deposit $295 -> $249 across the boardlog
- [roof-care] match guide page to offer page; align campaign emails to brandlog
- [button] add roof care offer linklog
- [job-hours] gated 2025-26 labour backfill (wrapper + revert ledger + MR exclusion)log
- [Quoting Tool - ui] wait for served raster frames in gallerylog
- [Quoting Tool - ui] export FeatureMap raster mask geometrylog
- [Quoting Tool - ui] restore raster gallery top-down maskslog
- [Quoting Tool - ui] keep raster gallery top-down unmaskedlog
- [Quoting Tool - ui] align raster gallery top-down renderinglog
- [Quoting Tool - ui] align FeatureMap raster maskinglog
- [Quoting Tool - deploy] require client Google Maps keylog
- [Quoting Tool - pricing] strip stale solar masking from sessionslog
- [Quoting Tool - pricing] exclude solar masking from canonical rowslog
- [Quoting Tool - ui] address Zoho line item reviewlog
- [Quoting Tool - ui] prevent Zoho line item dropslog
- [Quoting Tool - ui] align quote pricing and raster frameslog
- [Quoting Tool - ui] harden Zoho deal payloadslog
- [Quoting Tool - ui] serialize Zoho paint volumes as textlog
- [Quoting Tool - ui] normalize Zoho subform moneylog
- [Quoting Tool - ui] round Zoho money fieldslog
- [Quoting Tool - raster] select rendered imagery chiplog
- [Quoting Tool - ui] reflect rendered raster chip statelog
- [Quoting Tool - ui] address Street View review feedbacklog
- [Quoting Tool - ui] use panel street view for Gemini evidencelog
- [crm] add CM target verdict + merge labour chips on Job Economics widgetlog
- [haymes] attribute store-pickup (stock_skipped) paint to linked dealslog
- [crm] add Job Economics card widget (read-only related-list)log
- [crm] rebase Deal Gross Profit to Contribution Margin (internal)log
- [roof-care] refine campaign emailslog
- [crm] read Job Checklist related list via field_config=alllog
- [proposals] default warranty dropdowns by servicelog
- [haymes] merge portal credit twinslog
- [crm] cap Job Checklist related list to a compact footprintlog
- [crm] add Job Checklist DRE related list on Deallog
- [deals] add quote margin estimatelog
- [proposals] honour selected general painting warrantylog
- [job-hours] normalize benchmark service familylog
- [job-hours] reuse CRM token during benchmark snapshotslog
- [job-hours] deploy shared CRM helper to VPSlog
- [job-hours] honor VPS gws path in GP backtestlog
- [job-hours] add spreadsheet benchmark gatelog
- [invoicing] warn on mixed-site labour noteslog
- [books] use books datetime format for credit note verifylog
- [books] make xero response marker checks booleanlog
- [books] avoid parsing xero write responses as mapslog
- [books] guard credit note sync response readslog
- [books] avoid credit allocation row loop compile errorlog
- [books] sync credit note allocations to xerolog
- [bookings] reconcile delayed form leads to booking stafflog
- [Quoting Tool - inventory] address PR #87 Codex review (#88)log
- [Quoting Tool - ui] queryable raster-store inventory via the main search (#87)log
- [Quoting Tool - raster] grade the alignment banner on a measured frame-fit residual (#85)log
- [Quoting Tool - deploy] VPS smoke tolerates unlocked Nearmap spend by default (#83)log
- [Quoting Tool - raster] derive write-time survey-scale pixelSize at persist seam (#82)log
- [Quoting Tool - perf] add local-library perf smokelog
Week of 22 June 2026 76 changes
- [job-hours] handle split GP tracker dealslog
- [roof-care] hero pill 'Pre-winter' -> 'Winter roof care' (season has passed)log
- [roof-care] winter campaign send, Spam Act unsubscribe, staff acceptance verificationlog
- [job-hours] GP backtest — reconcile engine vs VIC GP trackerlog
- [job-hours] tolerate a trailing period on full names in HOURS_RElog
- [job-hours] extract dotted-initial names (recovers zero-extraction notes)log
- [job-hours] parse dot-separated work dates (parser + checker in lockstep)log
- [job-hours] resolve dotted-initial tech tokens to recover dropped labourlog
- [job-hours] backtest measures onsite accuracy + overtime coveragelog
- [Quoting Tool - raster] survey-scale frame alignment for cached tileslog
- [Quoting Tool - client] add optional react-scan dev profilerlog
- [Quoting Tool - scripts] anchor backfill-property-library to DATA_ROOTlog
- [job-hours] recover review-bucket matches in the backtest matcherlog
- [job-hours] precision-first job<->Deal matcher for the accuracy backtestlog
- [pricing] accepted-amount lock honours Approved_by_client tickboxlog
- [referrals] daily referral action-items tracker -> CRM Taskslog
- [invoicing] auto $200 referral fee deduction on eligible referee final invoiceslog
- [roof-care] soften T&C clause 22 (drop direct-debit promise) + bump terms versionlog
- [roof-care] mode-aware deposit copy + go-live config decisionslog
- [job-hours] cache CRM token in push_labour to survive backfill scalelog
- [haymes] harden stock equipment keywords + incremental crossover sweep (ADR 0044)log
- [job-hours] re-key 2026 backfill apply by stable content (drift-proof)log
- [job-hours] make backfill-gate canonical guard host-agnosticlog
- [tooling] local FSM job-image browserlog
- [geocode] accept BVD/ESP/ESPLANADE street types + esplanade-only fallbacklog
- [tooling] trigger-suppressed deal money-field setter for drift correctionlog
- [referrals] sync RF reward state to CRM + Referral Rewards viewlog
- [referrals] backfill CRM Referred_By into Referral Factorylog
- [pricing] hold accepted Amount on no-proposal deals to stop engine driftlog
- [Quoting Tool - vicmap] retry tuning + DEECA MapShare alternate-source failoverlog
- [Quoting Tool - crm-review] return 503 (unavailable) instead of 500 when tooling is absentlog
- [Quoting Tool - ui] force IPv4-first DNS to stop Vicmap Parcel API timeouts on VPSlog
- [Quoting Tool - ui] Vert chip click no-op when offline Vert is available but not loadedlog
- [Quoting Tool - zoho] write OAuth token caches to DATA_ROOT toolog
- [Quoting Tool - zoho] write sync cache to DATA_ROOT, not the read-only app dirlog
- [Quoting Tool - deploy] bake VITE_GOOGLE_MAPS_API_KEY into the client bundle at buildlog
- [Quoting Tool - deploy] mount data dir read-write so serve-path writes don't EROFSlog
- [monitoring] daily tripwire for post-send invoice re-stampslog
- [invoicing] freeze customer-issued invoices against silent amount changeslog
- [scope] general painting quotes get building scope, not rooflog
- [haymes] ref-location in stock ref overrides ShipFrom for branch (ADR 0044)log
- [haymes] stock cost-centre classification (ADR 0044)log
- [legacy-prep] generate Estimate_URL after scope rebuildlog
- [Quoting Tool - deploy] self-heal deploy-user perms in vps-deploylog
- [job-hours] add 2026 backfill review gatelog
- [job-hours] protect human CRM edits — gate push on reverse-sync, harden watermarklog
- [job-hours] NetStar travel-proof reconciler (temp-DB evidence)log
- [job-economics] surface per-job margin + labour-overrun for CRM dashboardslog
- [job-hours] host the nightly stack on the VPS (supersede ADR 0008)log
- [job-hours] env-overridable CRM-helper + gws paths for VPS hostinglog
- [job-hours] retry transient note-pull timeouts; caffeinate the Mac nightlylog
- [fsm] open JSA in contractor tablog
- [scheduling] add regional auto-send shadow flowlog
- [scheduling] add one-deal notification modelog
- [scheduling] include sms error details in summarylog
- [outreach] gate gap senders on customer opt-out (consent helpers)log
- [campaigns] add --clicker-followup mode to route email clickers to region-owned CRM taskslog
- [Quoting Tool - raster] save world-file frames by defaultlog
- [Quoting Tool - ui] wire raster availability policylog
- [Quoting Tool - ui] harden raster availability and offline TrueOrtho cachelog
- [Quoting Tool - deploy] add reviewed Nearmap content synclog
- [Quoting Tool - deploy] close nearmap sync apply racelog
- [proposal] NSW height-safety scope cites SafeWork NSW not Tasmanialog
- [roof-care] two-phase reserve/finalize advance-gate (Batch B inc 2)log
- [forms] preserve form duplicate backupslog
- [forms] route roof consult submissions to leadlog
- [roof-care] relay-HMAC + server price authority + evidence manifest on reservelog
- [proposal] make price decline follow-up same daylog
- [bookings] repair lead merge follow-throughlog
- [roof-care] stamp FSM Service_Type "Roof Care" on winter-maintenance jobslog
- [roof-care] harden reserve flow (gate page, key off the page, fail-closed webhook)log
- [haymes] avoid repeated cancelled order writeslog
- [haymes] reuse legacy invoice key on reextractlog
- [books-sync] harden xero invoice identity matchinglog
- [Quoting Tool - deploy] harden reviewed nearmap sync applylog
- [Quoting Tool - deploy] add reviewed nearmap content synclog
Week of 15 June 2026 217 changes
- [job-hours] use low coverage checkbox fallbacklog
- [job-hours] add ops labour approval applog
- [job-hours] add labour approval tracerlog
- [job-hours] flag low labour coverage on deal GPlog
- [job-hours] report approved-hours completenesslog
- [job-hours] prefer approved payroll anchors in reconciliationlog
- [job-hours] ingest approved payroll timesheets as the preferred spine source (ADR 0038)log
- [roof-care] pre-fill signer name with the deal's client name on the sign panellog
- [roof-care] drawn-signature acceptance on reserve + maintenance-deal cascadelog
- [Quoting Tool - deploy] expand default VPS SSH key pathlog
- [Quoting Tool - deploy] wait for auth after VPS restartlog
- [Quoting Tool - ui] default Nearmap tiles onlog
- [Quoting Tool - deploy] match Hostinger Traefik network modelog
- [Quoting Tool - server] harden VPS auth envlog
- [Quoting Tool - server] start compiled production runtimelog
- [Quoting Tool - server] lock down production debug surfaceslog
- [Quoting Tool - nearmap] gate DSM pitch spendlog
- [roof-care] align confirmation email breakdown to the page exactlylog
- [roof-care] confirmation email shows line items + pricing; BCC bailey on client emaillog
- [roof-care] webhook dedup + gated branded customer confirmation emaillog
- [haymes] morning-briefing liveness line for the overcharge price guardlog
- [haymes] exclude cancelled orders from countable spendlog
- [haymes] catalogue data-quality checks (unknown-codes wired, price-vs-RRP advisory)log
- [job-hours] correction_reentries review-queue reason (GH #27)log
- [job-hours] alias 6 high-confidence field-note initials/typoslog
- [job-hours] nudge on corrected re-entry notes (over-cap card)log
- [roof-care] make the reserve takeover terminal (no close, no resubmit)log
- [roof-care] full-screen thank-you takeover on reserve, referral as the herolog
- [job-hours] correct 72 stale allocation work_dates (deterministic)log
- [job-hours] read spaced 3-part dates ("21 -5-26") from the bodylog
- [job-hours] stop checker false-flagging field-note hour shorthandlog
- [job-hours] dropped_mention canonicalises by resolved tech, not raw tokenlog
- [job-hours] local web app for labeling the recon review batchlog
- [job-hours] curated review batch (TSV export + label round-trip)log
- [roof-care] serve clean customer offer by default on Railway; dev shell behind ?dev=1log
- [job-hours] nightly triage email — digest+exceptions, light HTMLlog
- [job-hours] reverse-sync — CRM hour-edits stick as sticky overrideslog
- [job-hours] dedup identical (deal|tech|date|hours) double-logslog
- [job-hours] reconciliation push-gate + execution wiring runlog
- [job-hours] WS4 reconciliation review queue + structured labelslog
- [job-hours] WS2 anomaly/consistency checks (read-only)log
- [job-hours] WS3 same-name tie-break via clocked-hours capacity (elimination only)log
- [job-hours] WS1 reconciliation persistence + over-breach triage + residual bandslog
- [roof-care] on-demand neighbour referral via Referral Factory personal linkslog
- [job-hours] reconciliation schema pre-step (tech_day_reconciliation + residual_band)log
- [job-hours] reconciliation anchor (clocked paid minutes) + first signallog
- [job-economics] per-Deal hours-vs-budget + gross profit (Annexure A Deliverable 1)log
- [haymes] monthly catalog refresh (launchd) + freshness checklog
- [Quoting Tool - ui] address PR review feedbacklog
- [Quoting Tool - ui] auto-render quote-ready local AIlog
- [Quoting Tool - property-library] derive local demo pinslog
- [Quoting Tool - raster] widen frame bbox serialization 6->8 dplog
- [Quoting Tool - ai-features] fail-closed archive fallback + served-clip identity headerslog
- [Quoting Tool - raster] derive true frame from world file + aspect-correct fallbacklog
- [Quoting Tool - ui] scope raster shared-survey quarantine to genuine conflictslog
- [Quoting Tool - raster] surface approximate-alignment noticelog
- [Quoting Tool - ui] show Street View + Raster Gallery for offline local-library loadslog
- [Quoting Tool - ui] stop address suggestions dropdown re-opening after select/searchlog
- [Quoting Tool - ai-features] geometry-guard archive fallback (region-scoped aiResourceId leak)log
- [Quoting Tool - ui] split demo cards into quote-ready/imagery tiers + Library searchlog
- [Quoting Tool - nearmap] add NEARMAP_SPEND_LOCK kill switch + reindex link testslog
- [job-hours] parser precision/robustness — hours-before tie, false tokens, inrlog
- [haymes] product-catalog metadata layer + line lookup catch-uplog
- [job-hours] parse unit-less "hours on site" trailing block in regexlog
- [mr-budget] invoice-style per-deal worklog + materials line itemslog
- [mr-budget] post-save redirect to dashboard via On_Success workflowlog
- [mr-budget] per-deal hours+materials breakdown + cost-code-only dashboardlog
- [mr-budget] Budget_Edit form live - read-only display + verified write-backlog
- [commercial-mr] trim unused MR fields, auto-stamp Commercial layoutlog
- [mr-budget] live Budget Tracker page snippet + form handlers wiredlog
- [haymes] keep fuzzy_unique re-matchable (add to guardAutoMethods)log
- [haymes] Layer C Gemini generator + enable fuzzy auto-link (surname-gated)log
- [mr-budget] live per-property budget+hours snapshot + client Budget Tracker portallog
- [haymes] fuzzy candidate generation for unlinked invoices (shadow mode)log
- [haymes] auto-link portal credits to original deal + parity guardrail + rebate-gap auditlog
- [proposal] suppress email-correction suggestion on opt-out blockslog
- [proposal] notify Deal Owner when proposal email send failslog
- [job-hours] labour current-truth status layer + alias/stopword fixeslog
- [books-sync] add Books-vs-Xero paid-invoice total reconciliation to daily monitorlog
- [scope] hold Scope_of_Works_Header when Hold_Scope_Of_Works tickedlog
- [books-sync] tolerate 1c GST rounding on part-paid invoices in Xero synclog
- [invoices] worklog per-day dates as d-M-yy (e.g. 10-6-26)log
- [finance] harden overdue invoice self-heallog
- [properties] per-site outstanding balance on Property recordslog
- [job-hours] catch duplicate-tech/over-cap allocations + surface HARD in nightly subjectlog
- [invoices] align weekly + terminal commercial-hourly outputlog
- [job-hours] tolerate "mim(s)" minutes typo in labour hours regexlog
- [roof-care] signed-link token generator for the offer sendlog
- [roof-care] hardcode acceptUrl default (env var wasn't reaching Railway runtime)log
- [roof-care] wire accept webhook + create priced maintenance deal on reservelog
- [job-hours] abstain when payroll clock-in conflicts with deal-cohortlog
- [job-hours] payroll-truth + employment-window crew disambiguationlog
- [job-hours] exclude pure managers from the labour push gatelog
- [job-hours] apply unique-first-name guard to contractor alias seedinglog
- [job-hours] crew disambiguator for ambiguous tech tokens (local-only, dry-run)log
- [job-hours] don't hard-default ambiguous first names (jake/benny/dean)log
- [job-hours] handle hours-before-name format + dave nickname [P1 gate fixes]log
- [mr-invoicing] skip ambiguous-billing check for hourly dealslog
- [job-hours] harden push engine for backfill scale [P2]log
- [mr-invoicing] activate nightly deal-forecast recalclog
- [job-hours] reconcile_deletes only auto-deletes date_move; never run pre-reparselog
- [job-hours] create + alias 7 former crew from Blip export [P0 #4b/c]log
- [roof-care] show the waived call-out as a struck line on annuallog
- [job-hours] safe scoped-delete reconcile + harden delete path [P0 #2]log
- [job-hours] alias 12 unresolved name/nickname tokens [P0 #4]log
- [roof-care] unify base price across modes (call-out is the only base difference)log
- [job-hours] backfill preflight tooling (mirror reconcile + roster) [P0 #1,#3]log
- [mr-invoicing] drop price-pin, always update Amount; fix currenttime TZ warplog
- [mr-invoicing] live deal forecast from actual hours + materialslog
- [roof-care] show the call-out fee as its own one-time linelog
- [finance] sweep self-heal also syncs aged partial paymentslog
- [finance] reconcileXeroPayments syncs partial payments (not just fully PAID)log
- [finance] backfill syncs partial Xero payments too (not just fully PAID)log
- [roof-care] stack perks left, cross out annual-only perks on one-timelog
- [job-hours] credit Benny Hall field hours (revert wrong exclusion)log
- [roof-care] drop top trust band + chips, benefit-led intro tickslog
- [roof-care] cut redundant copy on the offer pagelog
- [job-hours] window re-parse + CRM reconcile driverlog
- [finance] reconcileXeroPayments also auto-voids (recent-net void twin)log
- [finance] self-healing overdue sweep (auto-pay/void + total-mismatch flag)log
- [job-hours] alias firstname+surname-initial forms (jake g, ben b, db)log
- [job-hours] recover dropped techs + two-part dates in regex parserlog
- [finance] widen Xero->Books reconcile to 120d + scan partially_paidlog
- [job-hours] surface allocation accuracy flags in nightly emaillog
- [finance] resolve Xero/Books overdue-sweep discrepancieslog
- [job-hours] add deterministic allocation accuracy checkerlog
- [roof-care] lead-cheap rebuild (Amanda frontline feedback)log
- [job-hours] email nightly allocation run summary with per-note detaillog
- [roof-care] referral ack copy $100 -> $200 (match T&C clause 23)log
- [roof-care] apply Russ + Jamey meeting decisions (T&C + page)log
- [finance] flag overdue task payment statelog
- [campaigns] add TAS roof customer synclog
- [finance] clarify exception dry run skipslog
- [finance] send backfill digest to baileylog
- [finance] consolidate backfill finance emailslog
- [books] auto-repair crm-validated xero rounding holdslog
- [finance] match overdue invoices by xero invoice numberlog
- [finance] use applied books due-date filterlog
- [finance] bound overdue invoice preview scanlog
- [finance] avoid crm connection in overdue sweeplog
- [leads] route VIC TAS sales ownerslog
- [finance] add ops overdue invoice ladderlog
- [campaigns] add Bendigo roof customer synclog
- [invoicing] sync account invoice email contactslog
- [leads] make re-enquiry tasks same-daylog
- [sync] protect commercial xero contact email routinglog
- [sync] compare xero invoice line contentlog
- [sync] preserve invoice line descriptionslog
- [invoicing] bill linked Haymes paint lines despite stock flaglog
- [leads] prefer non-bookings duplicate keeperlog
- [haymes-match] A0 sticky-reject guard at matcher toplog
- [leads] add proactive lead dedupe mergelog
- [invoicing] bill weekly progress paint materials onlylog
- [invoicing] protect accepted discounts from product driftlog
- [invoicing] gate proposal discrepancy invoiceslog
- [pricing] archive removed roof product quantitieslog
- [pricing] detect stale accepted add-onslog
- [automation] gate deal re-enquiry alertslog
- [pricing] sync revised accepted amountlog
- [invoicing] honor discounted totals for final invoiceslog
- [invoicing] make Books FYI safety net workflow-compatiblelog
- [invoicing] add commercial invoice FYI safety netlog
- [campaigns] add incremental crm sync statelog
- [haymes-match] Wave 4 verification - 3 HIGH bugs (re-fire safety + wrong-link)log
- [campaigns] apply reviewed roof-only overrideslog
- [haymes-match] Wave 4 D3 sibling inheritance (review-only)log
- [bookings] return migrated state for repeated silent moveslog
- [haymes-match] Wave 4 D2 recall - Deal_Name search + associated-record tracelog
- [bookings] handle empty crm related-record responseslog
- [bookings] skip missing migration source bookingslog
- [bookings] read migration runner config from ops routinglog
- [campaigns] cache rejected sync contactslog
- [campaigns] accept invalid contact diagnostic codelog
- [haymes-match] Wave 4 D1+D1b classification + creditslog
- [bookings] add TAS silent migration runnerlog
- [invoicing] keep weekly audit details privatelog
- [invoicing] hide weekly draft notes from PDFslog
- [invoicing] normalize weekly references and cc deal contactlog
- [campaigns] ignore GP helper fields on roof jobslog
- [campaigns] avoid false GP flags on roof scopeslog
- [invoicing] set weekly invoice contact personslog
- [campaigns] expand rp no-gp sync evidencelog
- [invoicing] fold consumables into materials linelog
- [invoicing] periodize weekly progress draftslog
- [bookings] correct review signal fallback namespacelog
- [campaigns] sync roof customers to campaignslog
- [haymes] harden R5 homeowner-name filter (boilerplate strip + reject addresses/notes/glued)log
- [bookings] route TAS Amanda bookings to Emily reviewlog
- [haymes] matcher R5 homeowner-name recall + P5 common-colour suppressor (ADR 0028 Wave 2)log
- [haymes] per-deal Haymes Order Reference button (interim D2 bridge) + correct D2 to best-effortlog
- [haymes] parse manual link selected idslog
- [roof-care] drop 30-day gutter re-visit guarantee + gutter-guard policy (Russ feedback)log
- [haymes] surface widget selection diagnosticslog
- [haymes] parse selected invoice ids in widgetlog
- [haymes] add manual invoice deal assignment widgetlog
- [haymes] Wave 1D learning loop — reject path (L2) + threshold tuner (L3) + drift audit (L4)log
- [haymes] strip pack-size from colour capture in candidate exportlog
- [bookings] surface returning customer review contextlog
- [haymes] colour-mismatch auto-link suppressor in matcher (ADR 0028 P2c)log
- [bookings] prefer fresh leads for CRM booking taskslog
- [haymes] colour inverse-frequency weighting in lab chooser (ADR 0028 P4)log
- [pricing] use Metal Galv system for Kliplok roofslog
- [pricing] include rust converter for poor kliplok roofslog
- [Quoting Tool - roof] address review — parse string-form coverage bbox for tie-breaklog
- [Quoting Tool - roof] address review — guard missing-ratio mixed flag, share mix logic via @sharedlog
- [Quoting Tool - roof] flag mixed-material roofs below dominant-area majoritylog
- [Quoting Tool - raster] avoid duplicate perspective tile pickslog
- [Quoting Tool - archive] keep index queue locked after watchdoglog
- [Quoting Tool - raster] serve verified local gallery cache frameslog
- [Quoting Tool - harvest] address review — no retry on credit-bearing requests, cancel discarded response bodieslog
- [Quoting Tool - harvest] address review comments — guard undefined requests, non-string url, checkpoint latency snapshotlog
- [Quoting Tool - parcel-clip] address review — mirror recomputed areas into feature.propertieslog
- [Quoting Tool - session] isolate local property state identitieslog
- [Quoting Tool - harvest] retry/backoff wrapper for transient Nearmap fetch failureslog
- [Quoting Tool - parcel-clip] recompute clippedAreaSqm after polygon-clip intersectionlog
- [Quoting Tool - harvest] latency percentiles + error summary in run reportlog
- [Quoting Tool - arch] address PR #51 review findings (2 P1 + HIGH + style)log
Week of 08 June 2026 147 changes
- [gp-sign] personalised signing message (name, service, address, salesperson phone)log
- [gp-sign] deliver signing link via Email + SMS when contact has a mobilelog
- [gp-sign] coded Send GP Quote for Signature via ZohoSign APIlog
- [quote-scope] clean up mangled General Painting exclusion sentencelog
- [fsm] add clickable emergency map fieldlog
- [haymes] promote portal job-number Customer_Ref onto invoice in enrich_invoice mergelog
- [haymes] preserve job-number Customer_Ref through PortalOrder merge + re-extractlog
- [haymes] preserve-if-blank guard on Delivery_Instructions (ADR 0028 D1)log
- [property-locations] select top crm-safe map rowslog
- [property-locations] respect crm subform row limitlog
- [property-locations] raise n8n location import caplog
- [Quoting Tool - offline-archive] C1 S1+S2 — derived-cache/archive sinks + atomic raster/coverage bundles + in-memory adapterlog
- [fsm-checklist] Checklist_Exceptions report shows native Modified_User/Modified_Time (#21)log
- [property-locations] include over-cap draft rowslog
- [haymes] F2 verdict cache (T1.4) + audit trail (T3.3)log
- [property-locations] tighten map extraction promptlog
- [haymes] enrich F2 tiebreak prompt + abstain-default (Tier-2)log
- [property-locations] make n8n import text-firstlog
- [property-locations] prevent text fallback truncationlog
- [property-locations] fallback to extracted PDF textlog
- [property-locations] allow URL context fallback JSON parsinglog
- [haymes] deterministic + collision-safe Gemini tiebreak (Tier-1)log
- [property-locations] fallback to Gemini URL contextlog
- [property-locations] force PDF metadata on Gemini uploadlog
- [property-locations] call Gemini generation with CRM keylog
- [property-locations] surface Gemini generation errorslog
- [property-locations] use same Gemini key for file generationlog
- [property-locations] use n8n http helper for Gemini file uploadslog
- [property-locations] upload map PDFs through Gemini Files APIlog
- [haymes] F2 tiebreak model -> gemini-3.5-flash (bounded thinking)log
- [property-locations] avoid n8n map PDF base64 OOMlog
- [haymes] deterministic + JSON-mode Gemini tiebreak (F2)log
- [haymes] sync extractor shipped_from remap into n8n workflow JSON [NOT PUSHED]log
- [haymes] ShipFrom preserve-if-blank guard in upsert [STAGED — NOT DEPLOYED]log
- [haymes] ShipFrom preserve-if-blank guard in upsert [STAGED — NOT DEPLOYED]log
- [haymes] extractor maps HPS branch to shipped_from, deliver_to to customerlog
- [property-locations] queue large map PDFs through n8nlog
- [properties] add reviewed map locations apply buttonlog
- [properties] improve map extraction review noteslog
- [properties] retry map extraction via WorkDrive URLlog
- [haymes] auto-link suppressors P1/P2b/P3 [STAGED — NOT YET DEPLOYED]log
- [properties] use Gemini-enabled key for map extractionlog
- [properties] surface Gemini URL context failureslog
- [properties] make map extraction button deployablelog
- [properties] draft map location importslog
- [fsm-checklist] repo-sync regen guard, live CRM sync, signoff gatelog
- [briefing] add checklist-health checklog
- [haymes] bulk approver rolls up affected deals on link (deduped)log
- [briefing] surface Haymes frozen-link anomalies in morning briefinglog
- [haymes] OCR/collision-tolerant deal matching + stale-link guardslog
- [haymes] bulk-approve button splits selected ids on "|||" not commalog
- [haymes] list-view bulk-approve button for lab suggestionslog
- [client-portal] allow maintenance location fallbacklog
- [fsm] query account site tasks by numeric job idlog
- [client-portal] include maintenance locations in confirmation emaillog
- [haymes] extract glued job numbers from Customer_Ref tokenslog
- [client-portal] make maintenance locations primarylog
- [client-portal] group maintenance locations by categorylog
- [job-hours] send technician teams as arraylog
- [job-hours] gate technician backfill createslog
- [job-hours] add technician backfill dry runlog
- [haymes] lab-suggestion stamper + --all export invariant fixlog
- [haymes] Lab_Suggested approval button + batch approverlog
- [haymes] port roof_name_product_colour chooser into matcher (dry-run)log
- [job-hours] few-shot gold exemplars in materials system instructionlog
- [job-hours] system-instruction split + sync request_key echo defencelog
- [job-hours] materials-eval regression gate (cli materials-eval)log
- [job-hours] colour-keyed Haymes reconciliation + link honesty columnslog
- [job-hours] date-aware soft-trust Haymes context + proximity tie-breaklog
- [haymes] restore is_success_status helper lost in Backblaze restorelog
- [job-hours] hours_missing parity + author presence fallback + review fill-inlog
- [job-hours] author-aware identity resolution + allocation re-resolvelog
- [job-hours] author-slug + former-tech aliases, office accounts excludedlog
- [job-hours] Blip roster module + cli roster-map mapping reportlog
- [job-hours] author alias audit report (cli author-aliases)log
- [haymes] human-link guard + slash/hyphen job-token splits in matcherlog
- [client-portal] remove maintenance purchase order fieldlog
- [materials] review queue at backlog scale — ordering, defer, shortcutslog
- [materials] catalog repairs + General Painting product enablementlog
- [materials] preflight signal gates + deterministic LLM fast-pathlog
- [materials] deterministic prefilter + --skip-parsed targeting + NxM volumeslog
- [materials] review-aware reconciler at deal x product grain (ADR 0026)log
- [materials] validate review verdicts at the save choke pointlog
- [materials] repair reprocess sweep + catalog-miss tripwirelog
- [materials] edited Creator notes update in place and re-enter parsinglog
- [materials] parser hardening + dense material review workbenchlog
- [client-portal] require maintenance room fieldlog
- [Quoting Tool - raster-evidence] additive RasterEvidenceController facade + portslog
- [Quoting Tool - session] stop keepalive double-save; drop dead helpers; add serializer testslog
- [Quoting Tool - property-library] serialize index mutation with a per-rootDir mutexlog
- [Quoting Tool - property-library] link local artifacts for demo propertieslog
- [client-portal] map maintenance room to deal namelog
- [fsm] add account site requirementslog
- [mr-naming] derive [MR] <site> - <detail> deal names, renamer-owned + auto-refreshlog
- [client-portal] building picker + serviced-buildings range on MR formlog
- [billing] activate 15% consumables line on commercial invoiceslog
- [sign-audit] cross-deal signature audit, daily detection, incident docslog
- [sign-webhooks] process completion once + disable fingerprint when sign-doc records existlog
- [haymes] reject remittance/payment advices at the extraction gatelog
- [billing] suppress ambiguous-billing warning when Amount matches accepted proposallog
- [haymes] upgraded rows must take the new identity's Namelog
- [haymes] merge-on-upsert — one CRM record per purchaselog
- [haymes] payment-receipt gate + account-alias normalization at extractionlog
- [proposal] fold forced-amount adjustment into roof sections + re-anchor Force_Amount on acceptancelog
- [haymes] upsert hardening + Rebate_Class on portal subform rowslog
- [audit] read-only fleet audit for accepted-amount-lock stalenesslog
- [pricing] require explicit flags + price drift before skipping accepted-amount locklog
- [billing] warn ops when invoice billing target is ambiguouslog
- [pricing] skip accepted-amount lock when proposal config no longer matches deallog
- [roof-care] move no-roof-clean hatch inside the clean line itemlog
- [roof-care] no-roof-clean escape hatch on the recommended cardlog
- [roof-care] honest trust band + restoration year from Job_Finishlog
- [roof-care] mockup port + read-momentum conversion passlog
- [haymes] reject statement summary PDFslog
- [xero] surface missing Books invoice webhook errorslog
- [haymes] skip non-invoice backfill documentslog
- [roof-care] retire desktop dual-pane, single-column top-to-bottom layoutlog
- [books-sync] write off tiny Xero-paid residualslog
- [automation] repair creator technician sync gapslog
- [roof-care] perk value chips, founding countdown, pane-height fixlog
- [roof-care] guard upsell in recommended card, three tabs, Visit renamelog
- [roof-care] design hierarchy pass + personal roof imagerylog
- [roof-care] prescription-first hierarchy rebuild (ADR-0023)log
- [roof-care] accept webhook + CTA wiring (authored, not deployed)log
- [roof-care] founding-member cap, Winter-Ready Guarantee, roof-clean prescriptionlog
- [roof-care] conditions section, quote-framing copy, one-off price floorlog
- [invoicing] tolerate stale deposit invoice canonical searchlog
- [Quoting Tool - harvest] add offline checkpoint coordinatorlog
- [Quoting Tool - server] share Google Maps routes clientlog
- [Quoting Tool - ui] stabilize local-only raster smokelog
- [Quoting Tool - server] repair post-merge coverage artifact gateslog
- [Quoting Tool - feature-map] extract raster compositorlog
- [Quoting Tool - feature-map] add measurement binding registrylog
- [Quoting Tool - feature-map] add feature visibility modellog
- [Quoting Tool - ui] add harvest artifact requesterlog
- [invoicing] per-account invoice To/CC recipient nominationlog
- [invoicing] strip redundant account-name prefix from invoice site labellog
- [invoicing] per-tech worklog + site + works-prose on commercial hourly invoiceslog
- [Quoting Tool - offline-archive] deepen archive modulelog
- [Quoting Tool - coverage] deepen coverage session modulelog
- [Quoting Tool - crm] deepen commercial import modulelog
- [Quoting Tool - ui] deepen measurement workspace modulelog
- [Quoting Tool - commercial-leads] unify discovery modulelog
- [Quoting Tool - commercial-crm] deepen push module resiliencelog
- [Quoting Tool - ui] extract roof pricing snapshot modulelog
- [Quoting Tool - ui] add harvest spend gatelog
- [materials] harden material review recoverylog
Week of 01 June 2026 81 changes
- [commercial-mr] stampBuildingServiceHistory - per-building service history on Property subformlog
- [fsm-checklist] job-scoped technician access (remove flat nav, mobile-safe open, live summary)log
- [fsm-sync] derive Roof_Type from deal Condition1/2/3 on CRM->FSM synclog
- [fsm-checklist] persist Checklist_Template_ID + add Job Checklist nav sectionlog
- [job-hours-v2] streamlit launcher disables file watcher (watchdog.py shadow)log
- [job-hours-v2] rebuild streamlit review around current_allocations + historylog
- [fsm-swms] derive JSA SWMS from Services_Needed for commercial MR work orderslog
- [job-hours-v2] content-hash dedup + full reconcile so note-pull can't gaplog
- [job-hours-v2] capture trailing minutes in regex hours ("6hrs 45mins" -> 6.75)log
- [invoicing] per-product Haymes breakdown in the single Materials line descriptionlog
- [job-hours-v2] work_date_prefix scope on push_labour (month-by-month flush)log
- [commercial-mr] derive Service_Category from Services_Needed + PO as invoice reflog
- [job-hours-v2] round-2 crew aliases (Metcalfe/Scoble/Daneil/Harden/ZE/Christian/jnr typos -> existing techs)log
- [job-hours-v2] expand crew aliases + fix aliases.yml inline-comment parsinglog
- [invoicing] createInvoicesInBooks reads Account.Materials_Markup + align default to 20%log
- [invoicing] read Account.Materials_Markup (correct field), not Materials_Markup_Pctlog
- [job-hours-v2] per-request Gemini timeout (prevent unattended cron hang)log
- [job-hours-v2] use in-body work date, not FSM save datelog
- [brighthr] repair billable-hours rollup - allocations for hours, fix cost COQLlog
- [Quoting Tool - property-identity] route harvest phase1/phase2 through identityFromHarvestDeal (stage 3 - the leak fix)log
- [Quoting Tool - property-identity] add PropertyIdentity construction seam (stage 1)log
- [Quoting Tool - quote-wizard] pass FeatureMap key directly instead of via spreadlog
- [Quoting Tool - property-view] stop home-page infinite render looplog
- [Quoting Tool - feature-map] restore truthy-OR in edgeHover readDescriptionlog
- [Client-Onboarding-Guide - security] mask customer PII from Clarity session replaylog
- [Client-Onboarding-Guide - security] strip access token from URL before third-party analytics loadlog
- [Client-Onboarding-Guide - security] require two-factor legacy auth, lock full re-submission, persist rate limiterlog
- [invoicing] COQL Stage IN filter + Books customer name fallback (found in e2e test)log
- [job-hours-v2] nightly --push-all-window backfill modelog
- [invoicing] hold progress drafts unsent via cf_release_state=RELEASED + fix hours querylog
- [job-hours-v2] nightly close-the-loop orchestrator (pull -> parse -> gated push)log
- [job-hours-v2] recover run_nightly + backfill + migrate (fix crashed 2am job)log
- [job-hours-v2] automated incremental Creator note ingestionlog
- [job-hours-v2] map 3 contractors to real CRM Technicians + tech-scoped pushlog
- [invoicing] weekly progress-payment draft invoicing for commercial hourly accountslog
- [job-hours-v2] scoped + sentinel-safe labour pushlog
- [job-hours-v2] 3-model Gemini eval harness + hours comparisonlog
- [scheduling] detect pre-work form completion via DRE feed, not Job_Sub_Stagelog
- [bookings] use literal +10:00 for Remind_At, not toString("XXX")log
- [onboarding] sign customer onboarding links + redact link logslog
- [client-portal] use literal +10:00 for Job_Start, not toString("XXX")log
- [client-portal] use startDate offset for Job_Start, not zoho.currenttimelog
- [crm] re-enquiry surfacing for leads & opportunitieslog
- [roof-care] two-mode Annual Plan + One-off offer, responsive + live demo (#15)log
- [job-hours-v2] scaffold LLM-facing materials catalog from the 60 ruleslog
- [job-hours-v2] rebuild materials-extraction glue + restore cataloglog
- [job-hours-v2] repair recovered Gemini-batch path to runnablelog
- [job-hours-v2] restore lost extraction modules + repair broken importlog
- [properties] add pick-or-create contact widgetlog
- [Client-Onboarding-Guide - deps] patch vulnerable packageslog
- [Client-Onboarding-Guide - auth] prefer Replit secret refresh tokenlog
- [Client-Onboarding-Guide - config] use Replit secret for Zoho refresh tokenlog
- [Client-Onboarding-Guide - onboarding] restore deal link loadinglog
- [fsm] surface pre-work fascia type + colour confidence to crewslog
- [roof-care] safety-bias perimeter estimate to Q75 (4.68*sqrt area)log
- [fsm] propagate post-acceptance add-on changes to Job Descriptionlog
- [fsm] open JSA in new window to fix mobile deep-link hanglog
- [fsm] null-guard paint/desc map lookups (review)log
- [roof-care] improve perimeter model (4.8*sqrt(area)-6) + outlier guardlog
- [roof-care] calibrate perimeter estimate from 1,541 real-perimeter dealslog
- [roof-care] recompute edge protection on current rates (perimeter x state/floors)log
- [roof-care] price on LIVE rates (oppConsts + Products), not a stale snapshotlog
- [roof-care] hide solar option when no solar detected; drop the stepper hintlog
- [roof-care] add live dev preview (load any CRM Deal ID) + fix detection bugslog
- [roof-care] keep deselected service prices visible (muted), not a dashlog
- [roof-care] travel as a standalone "Call Out Fee" line itemlog
- [roof-care] EP only with roof clean; travel always includedlog
- [roof-care] keep safe access + travel charged when roof clean is deselectedlog
- [roof-care] editable solar steppers; bundle EP + travel into roof cleanlog
- [roof-care] drop the solar-panels summary line; keep the count editablelog
- [roof-care] hide on-file roof measurements from the customer viewlog
- [roof-care] detect solar panels + roof equipment from Opp_Productslog
- [roof-care] source captured quantities from Opp_Products; assess OSM/Solarlog
- [roof-care] apply DeGroot design system, proposal imagery, older-job fallbackslog
- [roof-care] add Roof Care Visit offer form (demo slice)log
- [fsm] auto re-sync FSM job when a roof is added after acceptancelog
- [client-portal] make Job_Start offset DST-awarelog
- [automation] harden Is_Manager_Only check in AutoAssignTechslog
- [client-portal] correct Property lookup JSON + Job_Start offset in MR form handlerslog
- [books] add sweepTerminalQuarantine daily self-heal for terminal QUARANTINED invoiceslog
- [pricing] re-apply Amount on failed final update in onOppUpadatelog
Week of 25 May 2026 25 changes
- [books-sync] guard deposit detection against negative deposit-deduction lineslog
- [proposal] hide flex checkbox without discountlog
- [proposal] move flex checkbox into cardlog
- [Quoting Tool - ui] OSM Overpass source with RoofCard perimeter chip (#12)log
- [Quoting Tool - ui] add Google Solar API source behind settings toggle (#11)log
- [Quoting Tool - pricing] slope picklist 45° boundary (Issue #1) (#10)log
- [Quoting Tool - ui] auto-fill substrate, danger, double-storey from NearMap AI (#9)log
- [zoho-bugs] add Gmail-to-routine dispatcherlog
- [fsm] add quick technician note actionlog
- [automation] notify on technician sync repairslog
- [fsm] group assigned-user job criterialog
- [fsm] stop remapping technician login emaillog
- [fsm] restore direct job visibility criterialog
- [fsm-sync] map CRM service categories for Creator jobslog
- [fsm] map login emails for job visibilitylog
- [referral] use Referral Factory API qualificationlog
- [referral] notify on qualification failureslog
- [fsm] filter job views by assigned userslog
- [automation] lock accepted work order pricelog
- [proposal] keep flexible scheduling checkbox visiblelog
- [fsm] prevent stage sync driftlog
- [proposal] show flexible scheduling checkbox on mobilelog
- [fsm] persist operations manager and job not ready stagelog
- [fsm] sync manual stage moves to CRMlog
- [automation] preserve amount during expected revenue roundinglog
Week of 18 May 2026 32 changes
- [billing] inline email alert at completion email-sync failure notelog
- [billing] inline email alert at deposit email-sync failure notelog
- [billing] handle Books 31027 dup-CP on completion invoice synclog
- [billing] handle Books 31027 dup-CP on deposit invoice synclog
- [scheduling] monthly ops-mgr approval loop with safety guardslog
- [fsm] asbestos checklist idempotency + invokeurl files listlog
- [fsm] auto-attach asbestos encapsulation checklist to FSM jobslog
- [mr] consolidate submitter job detailslog
- [mr] format notification emailslog
- [mr] notify submitter and operations managerlog
- [mr] use job start for maintenance requestslog
- [haymes] key portal orders by order numberlog
- [email-recapture] use standalone.smsLead for Lead-context bounceslog
- [email-recapture] extend SMS recapture to Lead-only bounceslog
- [email-recapture] intelligent dispatch by bounce typelog
- [email-bounce] rename hcef callers to handleCustomerEmailFailure1log
- [email-bounce] catch customer-email failures end-to-end with SMS recapturelog
- [automation] parse technician coverage bases in backfilllog
- [automation] support technician coverage baseslog
- [haymes] unblock portal ingest via Exec wrapper and External_Key pre-searchlog
- [automation] skip lead context for maintenance requestslog
- [haymes] dedupe portal-order upsert by External_Keylog
- [pricing] guard Veranda job-description loop, log retired-product preservationlog
- [unsubscribe] guard .left(800) on short Email record stringificationlog
- [unsubscribe] wire workflow rule + backfill + tutorial bannerlog
- [unsubscribe] auto-flip Email_Opt_Out on explicit unsub replylog
- [Quoting Tool - scripts] expand commercial lead finderlog
- [Quoting Tool - ui] consolidate feature map workflowslog
- [Quoting Tool - crm] harden Zoho sync flowslog
- [Quoting Tool - library] add property harvest serviceslog
- [Quoting Tool - ui] add MCP testing sidecarlog
- [Quoting Tool - pricing] retire veranda add-onslog
Week of 11 May 2026 56 changes
- [commercial-mr] ops manager SMS triage replaces tech autoassignlog
- [client-portal-mr] pivot from Email-anchor to Property-anchor with URL Account scopinglog
- [job-hours-v2] TB-8 Phase A safety guard on material-push plistlog
- [job-hours-v2] TB-7 manual delete CLI for Material_Usage rowslog
- [job-hours-v2] TB-6 watchdog checks for material push/pulllog
- [job-hours-v2] TB-5 nightly orchestrators + launchd plistslog
- [job-hours-v2] TB-4 Bulk Read pull-back from CRM Material_Usagelog
- [job-hours-v2] TB-3 reconciled material push (seed-insert + late-finding notes)log
- [job-hours-v2] TB-1+TB-2 Material_Usage CRM scaffold + reconcilerlog
- [crm-mr] add Submitter_Notes field on Deals (MR layout)log
- [commercial-mr] auto-set Deal Priority from Required_By_Datelog
- [commercial-mr] prefill Deal address from Property on MR buttonlog
- [commercial-mr] add Room field to Deal MR layout, drop description placeholderlog
- [commercial-mr] re-stamp [MR] Deal_Name at end of MR branchlog
- [commercial-mr] pivot Properties MR button to programmatic Deal createlog
- [commercial-mr] add Properties detail-page button to create MR Dealslog
- [workflow] idempotent stage handlers in onOppUpadatelog
- [invoicing] block late net-new invoices on already-invoiced dealslog
- [commercial-mr] bypass COQL parser bug in Haymes lookuplog
- [books-sync] skip permanent rounding-mismatch HELD invoiceslog
- [books-sync] skip Xero create on draft un-void cyclelog
- [fsm-sync] map CRM ops-manager ID directly to FSM usernamelog
- [fsm-sync] Creator wants dd/MM/yyyy for Required_By_Datelog
- [commercial-mr] harden MR-branch idempotency anchorlog
- [backfills] suppress workflow triggers on remaining one-shot mass writeslog
- [compliance,vehicle] suppress workflow triggers on scheduled bulk writeslog
- [commercial-mr] gate updateRecord INVALID_DATA responseslog
- [techs] scope ForceRefreshTechnicians purge to manager-only/inactivelog
- [tech-assign] resolve CRM Creator_IDs via per-tech read, robust FSM list iterlog
- [tech-assign] push CRM technicians to FSM Job subform in ForceRefreshTechnicianslog
- [commercial-mr] add trigger:[] to backfillRequestType bulk PUTlog
- [commercial-mr] correct Force_Amount type + Property field nameslog
- [commercial-mr] use raw v2 PUT in backfill, bypassing Deluge bulkUpdate type inferrerlog
- [tech-assign] self-heal manager techs at Operations_Manager stamplog
- [tech-assign] make stripOpsManagerFromTechs bilateral (CRM + FSM)log
- [tech-assign] skip Is_Manager_Only techs in AutoAssignTechslog
- [commercial-mr] one-shot backfill for Request_Typelog
- [commercial-mr] Haymes line-item materials + test-mode recipientlog
- [commercial-mr] wire Required_By_Date + Maintenance_Request to FSM Joblog
- [commercial-mr] MR branch in upsertCommercialDealDefaultslog
- [commercial-mr] add Maintenance Request schema fieldslog
- [tech-assign] backfill + strip Ops Manager tech leakage via Linked_Userlog
- [fsm-sync] map CRM Ops Manager email to actual Creator usernamelog
- [fsm-sync] stop CRM Technicians14 links from being deletedlog
- [commercial] stamp Deal.Hourly_Billed mirror flaglog
- [ops] hoist pendingUpdates list above paging loop in backfillOperationsManagerlog
- [perf] cast bulkUpdate response with toJSONList()/toMap()log
- [perf] cast COQL response with toJSONList()/toMap() in batched fnslog
- [haymes] use connection "crm" not "crm_connection" in COQL invokeurllog
- [haymes] route late-arrival task to Bailey, not deal ownerlog
- [haymes] α-guard rollup + v2 diff-before-rollup backstoplog
- [scope] restore re-bedding fallback wording on R&PW tile dealslog
- [fsm] require job on technician noteslog
- [proposal] show single timeline on Flexible Scheduling Discountlog
- [fsm] require job on technician noteslog
- [crm] top up missing technician linkslog
Week of 04 May 2026 36 changes
- [billing] replace Set() with List() in dailyHaymesRollupBackstoplog
- [billing] UAW materials rollup + cost-plus invoice linelog
- [audit] skip Amount mismatch check for hourly-billed dealslog
- [job_hours_v2] Phase 3 review + eval + calibrationlog
- [billing] skip pricing engine on hourly-billed accounts in onOppUpadatelog
- [billing] skip technician sync watchdog for hourly-billed accountslog
- [billing] commercial pay-on-completion hourly invoicing for UAWlog
- [job_hours_v2] stratified Phase 3 sample + holdout drawlog
- [job-hours-v2] audit-excluded CLI for Phase 2 exit gatelog
- [job-hours-v2] roster top-up — Roburn deal techs + nicknameslog
- [job-hours-v2] drop bare 1-char + digit-bearing tech tokenslog
- [job-hours-v2] default LLM model to gemini-3.1-flash-lite-previewlog
- [job-hours-v2] filter skip_authors in candidates SQLlog
- [job-hours-v2] alias Blakey typo to Benny Blakelylog
- [job-hours-v2] pace LLM calls + exponential 429 backofflog
- [job-hours-v2] alias map top-up + regex noun blacklistlog
- [job-hours-v2] wire parse-llm CLI subcommandlog
- [job-hours-v2] LLM extractor (slice 03 part 2)log
- [job-hours-v2] author classifier (slice 03 part 1)log
- [job-hours-v2] identity resolution + walking skeletonlog
- [referrals] show '(empty)' placeholder when raw Gemini response missinglog
- [referrals] set Lead_Status to Never Contacted on new survey-referral Leadslog
- [referrals] chase Task + email for Tier 2 incomplete referralslog
- [referrals] set Referrals_Processed flag early to close concurrency racelog
- [referrals] guard .left() on short strings in soft-fail pathlog
- [referrals] filter backfill by Survey_Response, not textarea fieldlog
- [referrals] use COQL like for DUPLICATE_DATA phone/email fallbacklog
- [referrals] wrap DUPLICATE_DATA searchRecords fallbacks in try/catchlog
- [referrals] add searchRecords fallback for DUPLICATE_DATA phantom idslog
- [referrals] route DUPLICATE_DATA through dedup-hit pathlog
- [referrals] replace while-loop, .split, list-trigger-arg syntaxlog
- [automation] process survey referrals from deal text into leadslog
- [fsm] differential CRM technician sync to prevent data losslog
- [automation] suppress tech-sync alerts on post-completion dealslog
- [books] ignore stale deleted Xero invoice matcheslog
- [automation] harden technician assignment synclog
Week of 27 April 2026 65 changes
- [job-hours] harden BrightHR CRM sync contractlog
- [haymes] F3 re-extract drivers for broken Haymes_Invoiceslog
- [haymes] F2 Gemini LLM tiebreak for ambiguous needs_reviewlog
- [haymes] F1 fuzzy/soundex surname fallback + un-gate narrow surname searcheslog
- [brighthr] include all admit confidences in rollup, supersede on demotelog
- [brighthr] JSA presence requires per-tech signature, not rosterlog
- [haymes] Phase E recall improvementslog
- [brighthr] make Phase F note-hours + JSA signals actually firelog
- [haymes] round Match_Confidence to integer; pin backfill sessionlog
- [brighthr] replace fanout with note-hours + JSA on-site signalslog
- [brighthr] recover allocations via deal-marker, fanout, ops-singletonlog
- [haymes] signal-driven matcher upgrade + backfill toolinglog
- [haymes] regex-extract invoice metadata, skip Gemini in steady statelog
- [brighthr] use char-class regex for note text punctuation striplog
- [brighthr] require note-mentions-tech before auto-picklog
- [haymes] export n8n workflow JSONs after pipeline optimizationlog
- [job-hours] quarantine BrightHR rollup email to bailey-onlylog
- [job-hours] dedupe unknown-tech Time_Entries on BrightHR_Entry_IDlog
- [job-hours] treat raw record response as success in __isCrmSuccesslog
- [job-hours] format Time_Entries datetimes as ISO 8601 with offsetlog
- [job-hours] add BrightHR sync webhook wrapperlog
- [job-hours] widen ops deal stage filter for tech lookuplog
- [referral] authoritative Referred_By overwritelog
- [books] use Books gross totals for invoice roundinglog
- [books] per-line rounding reconcile to prevent quarantinelog
- [books] use zoho-sign accepted lock for billing targetlog
- [commercial] simplify property outreach actionslog
- [fsm] make JSA sign-on job-firstlog
- [job-hours] add technician note allocationslog
- [haymes] add targeted invoice autopilotlog
- [leads] wire get quote webform address fieldslog
- [leads] match get quote postcode fieldlog
- [leads] finalize upstream address validation rolloutlog
- [haymes] track invoice match outcomeslog
- [leads] add upstream address validation flowlog
- [haymes] relink duplicate invoices by job numberlog
- [leads] harden google maps address accuracy v3log
- [books] match legacy Xero references for terminal invoiceslog
- [books] keep verified terminal cleanup metadata-onlylog
- [books] harden quarantined invoice matchinglog
- [leads] harden google maps address matchinglog
- [books] skip paid writeoff Xero writeslog
- [attribution] add inbound conversion capturelog
- [job-hours] add BrightHR alias triage gateslog
- [job-hours] normalise FSM job technician responselog
- [job-hours] normalise FSM note fetch responselog
- [leads] add speed to lead escalationlog
- [attribution] rely on CRM audit timestampslog
- [attribution] format captured timestamps for CRMlog
- [attribution] inline workflow capture wrapperslog
- [attribution] skip converted leads in backfilllog
- [attribution] paginate full backfilllog
- [invoicing] skip settled invoice line synclog
- [attribution] add workflow capture wrapperslog
- [attribution] make manual capture workflow-safelog
- [attribution] use safe workflow binding nameslog
- [attribution] use text for manual conversion detaillog
- [attribution] split conversion method capturelog
- [books] prevent one-cent Xero invoice driftlog
- [attachments] delete originals after confirmed folder movelog
- [attachments] check job folder on opp updatelog
- [attachments] self-heal job attachment folderslog
- [standalone] copy all job attachments to WorkDrivelog
- [standalone] backfill job attachment folderslog
- [job-hours] add BrightHR contract v1 synclog
Week of 20 April 2026 42 changes
- [leads] hide booking nudge attribution in noteslog
- [invoicing] add recurring invoice deal buttonlog
- [xero] suppress locked invoice retry noiselog
- [xero] improve books sync triage digestlog
- [xero] align watchdog with starter quotalog
- [xero] guard detailed response string handlinglog
- [xero] harden quota breaker and no-op guardslog
- [survey] add single mode for per-deal workflow-rule callbacklog
- [survey] catchup sender for broken Send Survey workflow rulelog
- [automation] send review sms on five-star surveylog
- [xero] refreshXeroToken reads breaker var via invokeurl not getOrgVariablelog
- [xero] CRM-side callers keep getOrgVariable; audit accepts both read pathslog
- [xero] deluge breaker uses self-stamped clock; refreshXeroToken always preserves suffixlog
- [xero] breaker preamble must read CRM var via invokeurl from Books contextlog
- [travel] preserve manual edits to Flexible_Scheduling_Discountlog
- [pricing] lock Amount to signed proposal + variations in accepted stageslog
- [pricing] cast proposal ID to long for tie-break comparisonlog
- [pricing] lock Amount to accepted proposal at Quote Acceptedlog
- [xero] plug breaker leak in Books sync fns + tighten auditlog
- [email] stop CC-ing every Account contact on proposal and quote sendslog
- [xero] bulletproof the rate-limit breaker (contract + watchdog)log
- [xero] quota heartbeat, circuit breaker, and kill retry sweeplog
- [xero] stop retryQuarantinedInvoices from burning daily quotalog
- [color-reminder] prevent duplicate Manual Follow-Up taskslog
- [notify] email admin on GP mainland job creationlog
- [duplicate-detect] re-enable call from Opportunity_On_Creationlog
- [duplicate-detect] replace \d{4} regex with char-level postcode striplog
- [duplicate-detect] standalone prefix + explicit map-list re-putlog
- [duplicate-detect] preserve street names from state-code striplog
- [clone] skip (Re-quote) suffix on lead paint dealslog
- [may-fill] prevent SMS hitting declined deals when contact has active onelog
- [color-reminders] suppress no-paint colour follow-up flowslog
- [sync] self-heal transient Xero validation quarantineslog
- [xero-webhook] normalize numeric signature + retry on Zoho 1000log
- [fsm-sync] alert on Creator job-update failures toolog
- [fsm-sync] alert on Creator job-create failurelog
- [ops-routing] phase 2 — more automations read Operations_Managerlog
- [deposit] self-heal missing deposit when stage = Job Createdlog
- [sign-webhooks] disambiguate duplicate contacts by phone + resolverlog
- [leads] suppress manual lead booking nudgeslog
- [ops-routing] stamp Operations_Manager at Quote Accepted, route all ops emails/tasks through itlog
- [Client-Onboarding-Guide - onboarding] suppress colour flow for wash-only jobslog
Week of 13 April 2026 22 changes
- [color-reminders] stop loop when count >= 4log
- [pricing] correct Trimdek Good CRC membrane coverage ratelog
- [contacts] simplify deal contact refresh triggerlog
- [contacts] compile deal refresh workflowlog
- [contacts] compare deal timestamps numericallylog
- [contacts] sync active deal summaries from dealslog
- [pricing] enforce 6% flex discount floorlog
- [travel] harden null address coord recoverylog
- [invoicing] remove workflow input fallbacklog
- [invoicing] match workflow wrapper to crm categorylog
- [invoicing] move salesperson resolver to standalonelog
- [invoicing] bind deal id for workflow repairlog
- [invoicing] rename owner-change workflow wrapperlog
- [invoicing] sync books salesperson from deal ownerlog
- [automation] expand legacy quote prep defaultslog
- [automation] add legacy requote prep flowlog
- [proposal] format multi-roof scope headingslog
- [travel] add nearby flex scheduling minimum discountlog
- [books] add manual invoice deal relink flowlog
- [Quoting Tool - scripts] add --people-csv domain matching and phone fallbacklog
- [Quoting Tool - scripts] add address fields, Account_Type, and contact dedup to CRM pushlog
- [Quoting Tool - scripts] commercial lead finder with multi-source enrichment pipelinelog
Week of 06 April 2026 13 changes
- [calendar] deploy Jobs_Calendar region colors, filters, and quickview/detailviewlog
- [sms] refine opt-out tiers and skip non-homeowner contactslog
- [calendar] add region + service type color coding to Jobs Calendarlog
- [sms] auto-classify inbound SMS replies and add campaign safeguardslog
- [Quoting Tool - ui] AI detection actions — overlay, split, exclude for roof conditionslog
- [proposal] hide Full Re-Screw add-on when price is 0 or blanklog
- [pricing] correct Kliplok surface factor and add heat reflective pricinglog
- [jobdesc] patch inclusion lines in-place instead of full regenlog
- [jobdesc] always regenerate job description to reflect inclusion changeslog
- [pricing] patch Expected_Revenue gaps in inactive stage and else-if pathslog
- [pricing] correct Expected_Revenue when Probability changes without Amount changelog
- [deposit] widen stage guard to allow self-healing for missed depositslog
- [deposit] prevent Calculation_Running race condition in deposit invoice creationlog
Week of 30 March 2026 21 changes
- [standalone] support compressed Google Ads configlog
- [conversions] add zoho google ads uploaderlog
- [conversions] prepare google ads sale export pipelinelog
- [Quoting Tool - pricing] refine paint volume calculation and enhance test coveragelog
- [Quoting Tool - pricing] update paint volume calculation and test caseslog
- [Quoting Tool - ui] fix visual bugs and polish for first-user stabilitylog
- [Quoting Tool - ui] unified roof view with design review fixes and architecture refactorslog
- [pricing] remove bare scope braces from flex discount blocklog
- [pricing] remove lockPricing gate from flex discount productlog
- [pricing] add Flexible Scheduling Discount to Opp_Productslog
- [proposal] add Flex_Sched_Accepted to OnSubmit handlerlog
- [pricing] normalize expected revenue precisionlog
- [pricing] add Amount drift detection under pricing locklog
- [email] CC Account contacts on 4 more customer emailslog
- [proposal] CC Account contacts on initial proposal emaillog
- [pricing] prevent negative variation double-counting and dedup removallog
- [proposal] CC additional Account contacts on proposal emailslog
- [invoicing] lock deal names and sync invoice customer datalog
- [invoicing] ensure Xero invoices have SentToContact flag and contact emailslog
- [proposal] replace em dashes with ASCII hyphens for Creator compatlog
- [proposal] use Opp_Products HSF over formula field for pricinglog
Week of 23 March 2026 22 changes
- [fsm] only sync roof images where client approved that rooflog
- [fsm] expand attachment sync whitelist from WorkDrive auditlog
- [fsm] whitelist + dedup filter for attachment sync to Tech Noteslog
- [jobs] replace water tank LLM call with keyword scanlog
- [jobs] tin tile substrate, water tank field check, held scope headerlog
- [jobs] gutter cleaning showing "040 LM" due to string concatenationlog
- [jobs] add missing product handlers to job description generatorlog
- [invoices] sync email to Books contact + remove stray contact personslog
- [invoices] add Open in Books and Open in Xero buttons for CRM Invoice detail viewlog
- [standalone] fix detectBookingAbandonment return type and Deluge compatlog
- [leads] Bitly link tracking field + booking abandonment detectionlog
- [leads] orphan task alerting + Lead_Source preservation functionlog
- [bookings] retry lead search for Bookings auto-creation race conditionlog
- [leads] correct booking URL param format for Zoho Bookings pre-filllog
- [leads] pre-fill booking form via URL params + Bitly branded short linkslog
- [leads] household dedup via surname + nudge matchinglog
- [proposal] restructure flex card to separate timing from checkboxlog
- [proposal] show full price when flex unticked and promote switch linelog
- [proposal] rewrite flex scheduling card copy and default to untickedlog
- [pricing] prevent duplicate Opp_Products from concurrent executionslog
- [sync] mark Xero invoices as SentToContact after synclog
- [invoicing] prevent auto-send of final invoices and fix Xero DRAFT stuck statuslog
Week of 16 March 2026 89 changes
- [proposal] sync flex discount display when add-ons togglelog
- [sms] add staff reminder SMS alongside customer booking reminderlog
- [proposal] center flex tick with css checkmarklog
- [proposal] center flex tick with background iconlog
- [proposal] replace invalid flex tick charcodelog
- [proposal] include flex tick in rendered htmllog
- [proposal] render flex tick via synced textlog
- [proposal] recenter flex tick with fixed offsetslog
- [proposal] use svg for flex card ticklog
- [proposal] center flex card tick iconlog
- [proposal] narrow desktop flex cardlog
- [proposal] cap desktop flex card widthlog
- [proposal] tighten flex card responsive sizinglog
- [proposal] keep flex card in sync with checkbox statelog
- [proposal] sharpen flex card clock iconlog
- [proposal] render grouped flex card amounts server-sidelog
- [proposal] run flex card sync after injected renderlog
- [proposal] draw flex card icons and comma-format totalslog
- [proposal] inline flex card money formatting in workflowlog
- [proposal] restore full flex sched offer cardlog
- [Quoting Tool - pricing] add inline product catalog and roof card chipslog
- [Quoting Tool - ui] rebuild quote workspace and roof map flowlog
- [proposal] simplify flex sched offer layoutlog
- [proposal] polish flex card state stylinglog
- [proposal] overlay flex checkbox on offer cardlog
- [proposal] render flex card server-sidelog
- [proposal] redesign flex sched offer cardlog
- [proposal] apply flex sched discount to loaded totalslog
- [proposal] simplify flex sched styling updatelog
- [proposal] align flex sched section with proposal demolog
- [travel] default Area_Visit_Window for proximity-matched dealslog
- [travel] use integer for Flexible_Scheduling_Discount fieldlog
- [sms] replace instanceof with try/catch for Deluge compatibilitylog
- [sms] dynamic reply routing and scheduled booking reminderslog
- [invoicing] remove invalid MANUAL_HOLD dropdown value from invoice creationlog
- [pricing] allow force_travel_reprice_once to bypass service fee freezelog
- [invoicing] prevent Xero sync from auto-sending final invoiceslog
- [travel] auto-populate flexible scheduling discount fieldslog
- [proposal] add flexible scheduling discount to CustomerProposallog
- [sync] authorise Xero invoice after draft release in same executionlog
- [email] disable signed quote sendmail fallbacklog
- [Quoting Tool - ui] merge main-only changes into unified roof viewlog
- [Quoting Tool - ui] unified roof view with inline pricing, AI dictionary, boundary editing, and Gemini segmentationlog
- [pricing] extend gutter LM fields to gutter guard pricinglog
- [pricing] add per-LM gutter cleaning measurement fields and pricinglog
- [travel] write Closest_Base from TravelFees updateMap and add backfill scriptlog
- [email] add meaningful return messages to resendSignedQuotelog
- [email] fix send_mail payload and remove sendmail fallbacklog
- [sms] add inbound SMS reply enrichment with CRM job contextlog
- [pricing] auto-add NuTech Silver product when colour selectedlog
- [attachments] filter out PDFs, invoices, and signatures from synclog
- [fsm] fix attachment sync dedup guard and folder resolutionlog
- [attachments] fix WorkDrive folder mismatch and auto-sync photos to FSMlog
- [email] use string return type for standalone resendSignedQuotelog
- [email] add resendSignedQuote button functionlog
- [email] add fallback alerts and fix unreliable body: keywordlog
- [scheduling] add SMS notifications and CRM send_mail for monthly schedulinglog
- [signature] add Creator fallback + fix send_mail + connection scopelog
- [fsm] use live-safe checklist stamp fieldslog
- [fsm] avoid oversized checklist ids in task generationlog
- [pricing] refine R&PW scope and warranty per Russell's feedbacklog
- [invoicing] check Books for existing invoices before missing-deposit alertlog
- [pricing] add Cement/Terracotta Tile Repair and Pressure Washing conditionslog
- [books-sync] mark synced invoices as Sent in Xero via SentToContact flaglog
- [invoicing] prefer Account over Contact for deposit invoices and fix stage advancelog
- [scheduling] add SMS notifications and fix ops manager user IDslog
- [books-sync] set reference_number on Books invoice and hash all line itemslog
- [pricing] extend validation rule to require approval before advancing deallog
- [books-sync] skip updates for voided Zoho Books invoiceslog
- [fsm] remove stale task onload field hidelog
- [fsm] avoid subform count in tile checklist seedlog
- [fsm] remove alert usage from checklist reset functionlog
- [fsm] deploy checklist v2 mobile workflowlog
- [proposal] reorder signature sync before stage change in OnSubmitlog
- [automation] add trigger:[] to 26 unprotected updateRecord callslog
- [color-deferral] respect customer's deferral choice from onboarding formlog
- [scope] add Regenerate Scope of Works button for dealslog
- [scheduling] add CRM template support and conditional CTAslog
- [billing] add token refresh timestamp to credit note synclog
- [billing] remove xero_connection fallback from invoice synclog
- [travel] restrict 14% travel fee cap to Roof Painting onlylog
- [prework] send CRM mail payloads as JSONlog
- [finance] add sync monitoring and validation toolinglog
- [billing] harden deposit sync and finance recoverylog
- [scheduling] add monthly client notification workflowlog
- [workflow] backfill technician jobs on onboardinglog
- [fsm] add mobile checklist categories and actionslog
- [proposal] refresh decline flow and proposal experiencelog
- [pricing] add quote lock controls and repricing safeguardslog
Week of 09 March 2026 2 changes
- [billing] harden deposit canonicalization and xero synclog
- [compliance] add training cadence and remaining CRM automationslog
Week of 02 March 2026 2 changes
- [vehicle-sync] add trip sync and xero invoice lookupslog
- [routing] add technician refresh and cold climate rolloutlog
Week of 16 February 2026 1 change
- [xero] add books sync and invoice recovery flowslog
Week of 09 February 2026 1 change
- [ops] add paint ordering and technician-note backfillslog
Week of 02 February 2026 5 changes
- [automation] add signed quote and booking flow updateslog
- [automation] accept booked statuslog
- [automation] normalize booking statuslog
- [automation] gate lead status on valid bookingslog
- [automation] implement technician refresh and proposal email functionslog
Week of 26 January 2026 16 changes
- [Quoting Tool - ui] lazy-load raster gallerylog
- [Quoting Tool - ui] lazy-load QuoteWizardlog
- [Quoting Tool - ui] add lazy panels helperlog
- [workflow] preserve condition block on heat togglelog
- [scope] ensure Heat Reflective description is always included in scopelog
- [pricing] allow manual $0 Heat_Price_Rounded for all dealslog
- [pricing] allow manual edits to Heat_Price and Heat_Price_Rounded fieldslog
- [pricing] respect manual edits to Heat_Price_Rounded deal fieldlog
- [automation] block job creation when technicians missinglog
- [pricing] update invoicing and paint/retarget pricing logiclog
- [haymes] improve document matching and upsert robustnesslog
- [automation] improve roof scope generation and scaffolding noteslog
- [standalone] add pricing/invoicing audit and maintenance scriptslog
- [workflow] send signed quote only when signature presentlog
- [techs] add refresh technicians buttonlog
- [proposals] add resend-safe proposal email buttonlog
Week of 12 January 2026 43 changes
- [Quoting Tool] request 800x600 images instead of thumbnailslog
- [Quoting Tool] add address matching and image proxy for listing photoslog
- [Quoting Tool] update Apify scraper to handle response format correctlylog
- [Quoting Tool] use tilde in Apify actor ID (scrapemind~ausscraper)log
- [Quoting Tool] switch to Apify ausscraper for property listing datalog
- [Quoting Tool] use CSS variable for listing link and selection colorslog
- [Quoting Tool] pass propertyListing as prop to avoid duplicate API callslog
- [Quoting Tool] pass listing data to RasterGallery componentlog
- [Quoting Tool] remove unused listingLoading and lightbox code, use window.open for thumbnailslog
- [Quoting Tool] add listing photos section to FeatureMap sidebarlog
- [Quoting Tool] use URL as key in ListingPhotosTab for stable React renderinglog
- [Quoting Tool] add listing photos tab to RasterGallerylog
- [Quoting Tool] add usePropertyListing hook for fetching listing datalog
- [Quoting Tool] improve property-listing endpoint error handling and DRY slug generationlog
- [Quoting Tool] add /api/property-listing endpoint with 24h cachinglog
- [Quoting Tool] improve browser cleanup and status detection in scraperlog
- [Quoting Tool] add Puppeteer scraping utility for realestate.com.au property profileslog
- [Quoting Tool] add PropertyListing types for realestate.com.au integrationlog
- [Quoting Tool - RoofCard] use actual roof condition options matching Gemini promptlog
- [Quoting Tool - FeatureMap] map detailed Gemini conditions to simple dropdown valueslog
- [Quoting Tool - server] use ES module import for crypto instead of requirelog
- [Quoting Tool - FeatureMap] pass AI result and override handler to RoofCardlog
- [Quoting Tool - FeatureMap] collect detections, store AI results, auto-append to noteslog
- [Quoting Tool - RoofCard] add AI badge with tooltip showing confidence and findingslog
- [Quoting Tool - RoofCard] add AIConditionResult type and propslog
- [Quoting Tool - server] add override endpoint for user condition changeslog
- [Quoting Tool - server] cache gemini results and return enhanced responselog
- [Quoting Tool - server] include detections in gemini prompt and add confidencelog
- [Quoting Tool - server] add cache lookup for gemini condition analysislog
- [Quoting Tool - server] add cache infrastructure for gemini condition analysislog
- [workflow] rebuild opportunity and proposal workflowlog
- [Quoting Tool] add hover tooltip for manual detectionslog
- [Quoting Tool] manual detections subtract from paintable arealog
- [Quoting Tool - polygon-edit] click outside to deselect polygonlog
- [Quoting Tool - polygon-edit] add keyboard shortcuts (Escape, Delete)log
- [Quoting Tool - polygon-edit] add click-on-edge to insert vertexlog
- [Quoting Tool - polygon-edit] add rubber-band effect during vertex draglog
- [Quoting Tool - polygon-edit] add visual feedback for hover stateslog
- [Quoting Tool - polygon-edit] add cursor management for hover stateslog
- [Quoting Tool - polygon-edit] wire up hover detection in mouse movelog
- [Quoting Tool - polygon-edit] add ctx safety to hover hit testinglog
- [Quoting Tool - polygon-edit] add hover hit testing utilitylog
- [Quoting Tool - polygon-edit] add hover state variableslog
Week of 05 January 2026 5 changes
- [launceston-retarget] add "Launceston Requoted" tag after applying pricinglog
- [launceston-retarget] reset stage to allow recalculationlog
- [automation] trigger deal recalculation after retarget pricinglog
- [automation] use Heat_Price_Rounded fields instead of Heat_Pricelog
- [automation] add Launceston Retarget pricing button functionlog
Week of 08 December 2025 1 change
- [billing] expand pricing and invoice automationlog
Week of 03 November 2025 1 change
- [travel] add roof scope and travel fee recalculationlog
Week of 20 October 2025 1 change
- [attachments] add Haymes and attachment sync foundationslog
Week of 18 August 2025 1 change
- [fsm] add FSM hooks and deal update synclog