FixCase notes refresh after saving and show edit controls for the signed-in author
FixCase exit and notification preferences return to their expected destination
FixLinked case contacts display current contact fields and unlink reliably
FixUpload multiple case documents with bounded progress and manual retry; successful files are not resent
FixSearch, move and rename case documents while preserving their stored files and extensions
FixWorkers Comp insurance fields preserve other case metadata, and Garden walking supports touch controls
FixCase details display the existing Date Signed value
NewView the recorded accident description on the case dashboard and open the existing case editor to update it
v0.52.0.9
October 20, 2026
Journey list access checks
SecurityFirm-wide case lists and demand-letter pickers require active staff access in the current firm; expired access and older firm sessions cannot read those lists
SecurityJourney list reads keep the authenticated firm and staff identity through their database queries
v0.52.0.8
October 19, 2026
Find and link existing case contacts
FixLink Existing searches the current contact list by name or company, with category filters and pages so older medical providers can be found
FixChanging contact search, category or page clears the old selection before a new result can be linked
FixPartial contact-link failures preserve failed selections and the relationship for retry without resending successful links
v0.52.0.7
October 19, 2026
Backward case moves and SOL review
FixMove a case back to an eligible earlier stage; a newer stage change requires a refresh before retrying the original move
FixFailed required stage actions roll back the move so retrying does not duplicate tasks or stage history
FixSelected intake assignments apply when sending begins and remain recorded if documents need a retry; older sends preserve newer case changes
FixNorth Carolina SOL estimates show statute citations and the facts that need review before a deadline is confirmed; manual and unverified legacy dates stay preserved
FixCSV matter imports preserve stored flags and case details, original creator attribution and confirmed deadlines; contact matching handles blank email variants, rejects ambiguity and recovers from concurrent imports
v0.52.0.6
October 19, 2026
Browser zoom and standard document previews
FixDragging a case onto an empty stage, including Pending Release, now follows the pointer across the whole column and opens the stage confirmation
FixDialogs stay within the screen and scroll at browser zoom so their action buttons remain reachable
FixCase details wrap at browser zoom so field values stay readable
FixPreview the standard retainer, HIPAA authorization and intake form in Signing Documents before sending; previews use placeholder client details and do not send or save documents
v0.52.0.4
October 18, 2026
Reports export cleanly
FixReport CSVs now open cleanly in Excel: notes with quotes or line breaks stay in their own column
FixThe Journeys report shows case number, client, pipeline, stage, status, dates, referral source and the assigned attorney and paralegal by name instead of internal IDs
FixThe Cases report lists the firm's Prelitigation and Litigation cases instead of returning no records
FixRecent Reports entries are named by type, date range and who ran them
SecurityThe Users report no longer includes password hashes and is limited to firm admins
v0.52.0.3
October 17, 2026
Jam screen recording switched off
SecurityHoLaCe no longer loads the Jam screen recorder, and the Jam webhook no longer accepts recordings, so screens with client data stay inside HoLaCe; report problems with the in-app bug button
v0.52.0.2
October 16, 2026
Repeat website inquiries join the same case
FixWhen the same person sends a website inquiry again within a day, it is added to their open case as a note instead of opening a second case
v0.52.0.1
October 16, 2026
Firm contracts and HIPAA forms count when signed
FixA firm's own retainer or HIPAA form, sent in an intake packet or on its own, now marks the contract signed or HIPAA received when the client signs, and moves the case forward like the built-in documents
v0.52.0.0
October 16, 2026
Demands page and firm-set attention limits
NewNew Demands page: every open case from Demand Sent through Negotiations in one list, with carrier, adjuster, policy limits, amount demanded, sent and due dates, latest offer and days outstanding; filter, sort and export to CSV
ImprovedThe case Demand tab and the Demands page read the same facts, so they always agree; offers come from the negotiation log first
NewSettings, Attention limits: set when a case turns medium, high or critical, firm-wide or per stage, plus the RED and alert values and which flags reach the morning brief
ImprovedEvery attention flag now says why it fired, on the dashboard and in the morning brief
FixSaving the Demand tab no longer fails on settlement fields the record does not have
v0.51.2.7
October 15, 2026
COO dashboard: say what the attention flags mean
ImprovedNeeds My Attention: the Days column now reads Days in stage, and a line under the table lists the limits behind Critical, Past due, High and Medium
v0.51.2.6
October 15, 2026
Medical chronology: one bad date no longer fails a record
FixA medical record no longer stops with Error when the AI reads an impossible date; that one item is skipped and the rest of the record is processed
v0.51.2.5
October 15, 2026
Tasks: show the ones assigned to me
ImprovedThe Tasks page has an Assigned to filter: anyone, me, or unassigned
v0.51.2.4
October 15, 2026
Morning brief at 7 AM Central
FixThe daily morning brief email goes out at 7:00 AM Central, adjusting for daylight saving (it went out at 7:00 UTC, which is 2:00 AM in Texas)
v0.51.2.3
October 15, 2026
Notification settings page works
FixNotifications (from the user menu) opens a working page where you turn the daily morning brief email on or off; it was a placeholder that never loaded
FixThe old notification toggles under Organization Settings, which never saved, now open the working page
SecurityThe profile API no longer sends the password hash to the browser
v0.51.2.2
October 14, 2026
Notes hold pasted emails
FixNotes take up to 50,000 characters (was 5,000), so a pasted email or letter saves; when a note cannot be saved, the message says why and the text stays in the box
v0.51.2.1
October 14, 2026
Set a new password after a magic-link sign-in
FixWithin 15 minutes of signing in, a user can set a new password without entering the old one, so people who sign in by magic link can choose a password
v0.51.2.0
October 14, 2026
Adjusters grouped by claim, linked cases listed once
FixInsurance Adjusters groups each adjuster and insurer under the 3rd party or 1st party claim their Clio role names; contacts whose side Clio does not record are listed separately
FixA linked case shows once in Related Contacts instead of twice
ImprovedClio import sets the case address from the client and keeps phone numbers Clio stores as Other Phone
v0.51.1.0
October 14, 2026
Insurance adjusters on the case dashboard, phone layout, safer Clio refresh
FixThe case dashboard lists every adjuster and insurer linked to the case, with their role, phone and email
ImprovedThe case dashboard stacks into one column on phones and two on tablets
FixClio import files adjusters and insurers as insurance contacts and keeps the phone number Clio stores as Other Phone
FixClio refresh preserves primary contacts and prevents a second primary contact on a case
FixClio refresh preserves statement medical bills and reports unindexed Clio bills without changing statement charges or adding duplicates
v0.51.0.0
October 13, 2026
Fee arrangements per recovery, disbursement statement fixes, DFox Law move from Clio
NewEach recovery can carry its own fee arrangement (contingency on gross or net, flat, hourly, none), switched on per firm
NewFee splits record when the other firm disbursed, and settlement imports read it from the notes
FixDisbursement statements: unpaid proceeds line restored, balance owing uses the amount owed, fee division shows the discount, client advances labelled, signature uses the responsible attorney
FixDashboard counts fee-only matters as settled and books imported closed cases in the month they closed
FixClosed list ignores out-of-date responses; a blank name search matches nothing
ImprovedClio import follows Clio status and close dates, links each matter to its client of record and types the other relationships; Lawmatics import links by Clio client reference
v0.50.0.0
October 12, 2026
Settlement value added, policy limits, outstanding balances, client advances, case opening fee
NewRecoveries are labeled by who pays (third party, first party UM/UIM, PIP, MedPay); PIP and MedPay never carry a contingency fee
NewPolicy limits checkbox on each recovery; policy-limits recoveries count as wins on the dashboard
NewOutstanding balances on the settlement and disbursement views, deducted from the client only when the client pays them
NewValue added: medical savings (balance owing to final) and negotiation lift (first offer to final) on the disbursement statement and dashboard
NewCase opening fee firm setting: adds a set case expense (for example a 250 dollar Administrative Fee) when a new case opens
NewClient Advance expense category: money advanced to the client is repaid from the settlement and kept out of the firm case costs total
ImprovedSettlement sheet import reads policy limits, the new recovery types and outstanding balances; new reader for Clio per-matter Settlement exports
ImprovedSettlement import places each Clio or PDF disbursement statement on its case by matter number and client name, creates the medical bills it lists, and a read-only parity report compares every case with its statement to the cent
FixSettlement and disbursement tables keep their columns aligned when they scroll
FixAn expired sign-in now returns you to the login page instead of an error
FixForms that send an invalid value get a clear validation message instead of a server error
SecurityRecovery and lien routes now check firm and case on every lookup
v0.49.6.0
October 7, 2026
MyFileRunner offboarding, self-hosted fonts, settlement import model
SecurityDeactivating a user or moving them to another firm now removes their saved MyFileRunner credentials in the same database transaction. Firm administrators can also disconnect MyFileRunner for a connected team member from Team Settings, with firm-scoped authorization and an activity record.
ImprovedApplication fonts are bundled from their official open-source releases, so production builds no longer fetch Google Fonts over the network.
ImprovedClio imports treat Clio adjustments as the settlement reduction (incurred equals billed), and a Clio refresh never overwrites settlement figures (reduction, final, paid) already recorded on a bill.
v0.49.5.2
October 7, 2026
MyFileRunner switched off for firms until the agreement is signed
ImprovedThe MyFileRunner sign-in, buttons, dashboard card, service-provider tile and settings card are hidden for every firm, and the MyFileRunner endpoints answer not found, until the MyFileRunner agreement is signed. It stays available on the test environment.
v0.49.5.1
October 7, 2026
Settlement sheet import tool; support page link cleanup
ImprovedInternal import tool loads settlement figures (recoveries, fee rates and discounts, bill paid, reduction and final amounts, other liens) from a firm-filled sheet into matching cases, dry run first, scoped to one firm, and safe to re-run.
FixRemoved a link to an agent manifest page that does not exist from the support pages and homepage.
v0.49.5.0
October 7, 2026
Agent support pages and agent line on outbound messages
NewPublic support pages for AI agents helping a person: holace.io/support/llms.txt and holace.io/support/agent.md explain how to diagnose an issue and draft a support request for the person to send.
ImprovedClient-facing emails and messages end with one short line pointing AI agents to those pages. Internal notifications leave it out.
v0.49.4.0
October 6, 2026
MyFileRunner sign-in and placements, firm signup attestation, Sentry release tagging
NewEach user can securely save their own MyFileRunner token credentials and open the matching Texas, California, or Illinois account through a short-lived signed login redirect.
NewConnected firms can open a case in MyFileRunner from the journey header, Litigation tab, and service-provider picker. Firms that are not connected are directed to integration settings.
NewThe dashboard now introduces MyFileRunner court filing and records retrieval, shows supported states, and lets firms request another state through the feature wishlist.
NewFirm signup and demo request forms now require a sworn confirmation that the firm does not perform defense work for insurance companies. Both public APIs enforce the confirmation, and the attestation time is retained with the signup token, resulting organization, or demo request email record.
ImprovedSentry events from the browser, server, edge runtime, and background worker now carry the correct deployment environment, commit-based release, and HoLaCe owner tag.
ImprovedRailway builds upload source maps when its Sentry token is configured, while local and token-free builds remain offline.
FixExpected requests for Server Actions from an older deployment are filtered out so post-deploy traffic does not create noisy Sentry events.
v0.49.3.0
October 5, 2026
Firm fee rules, and Clio stages kept current without importing Clio deadlines
NewFirm administrators can configure a default contingency rate plus a higher rate that begins at a selected litigation stage. Once a case reaches that stage, the litigation rate stays locked even if the case later moves backward, while an explicit case rate always takes priority.
NewThe Clio API refresh now reconciles known native matter stages to Avenue stages, preserves the native stage timestamp, records an audit history row for each change, and reports unknown stage names for review.
FixClio import paths no longer trust or persist Clio statute-of-limitations values. HoLaCe derives the deadline from the imported incident date with its existing Texas SOL calculation.
v0.49.2.3
October 4, 2026
Medical bills table rows line up on smaller screens
FixOn the Damages tab the Provider column could collapse to zero width on 1280 px screens, so provider names wrapped one word per line into the Type column and the Reduction and Reason inputs sat far below the row they belonged to. The Provider column now has a fixed width and the table scrolls sideways instead (GH #401, reported by DFox Law).
v0.49.2.2
October 2, 2026
Clio API import: matters request accepted by Clio
FixThe Clio API importer requested matter custom fields with a doubly nested field list that Clio rejects (400 InvalidFields); the request now asks for the picklist option as a whole object, which Clio returns in full. Found on the first live run for DFox Law on Oct 2.
FixThe Clio API importer no longer flattens a specific contact role (adjuster, defendant, guardian, family member, physician) to a generic one when a firm's free-text Clio label is unfamiliar: adjuster-style labels now map to the adjuster role, and an existing specific role is kept unless the change adds information (generic to specific, or marking the client as primary). The dry-run summary lists every proposed role change.
FixAn interrupted Clio API import can be re-run safely: the per-journey import index is saved after each phase instead of only at the end, and the Clio client retries transient network failures (DNS, connection reset) with backoff.
ImprovedClio API errors now include the request query and the first 300 characters of Clio's response body, so a rejected field or filter is visible in the log instead of a bare status code.
v0.49.2.1
October 1, 2026
Settlement disbursement layout stays aligned
FixThe Settlement tab now keeps recovery, fee, expense, medical bill, lien, and net-proceeds amounts visible and aligned at desktop demo widths without creating horizontal page scroll (GH #398).
v0.49.2.0
October 1, 2026
Clio API imports complete case financials
NewThe Clio API importer now adds medical providers and bills, special and general damages, settlement figures, and matter contact relationships that are absent from the weekly export.
v0.49.1.0
September 30, 2026
Suit filed date
NewCases now record the date suit was filed in Edit Case and show it on the Litigation tab. The field is also available for firms to use as a future Case Filing stage requirement (GH #391).
v0.49.0.5
September 30, 2026
Stage progress counters stay with the current stage
FixJourney cards and detail pages now count only the current stage's completed steps, so earlier-stage work no longer produces counters such as "9 of 4" or pins progress at 100% (HLC-002, HLC-003, HLC-004).
v0.49.0.4
September 30, 2026
Case dates stay on the day entered
FixDate of Loss, date of birth, claim-report, contract, and statute-of-limitations dates now keep the same calendar day through entry, editing, imports, case details, and document prefill in every US time zone (HLC-001).
FixCase creation and editing now use the same Date of Loss label as Case Details and generated documents (HLC-010).
v0.49.0.3
September 30, 2026
Related contacts are complete again
FixThe Related Contacts panel now includes contacts linked through the current relationship system as well as older case-only links, without showing duplicates. Relationship roles are displayed, and newly created, linked, or edited contacts keep their case relationship in sync.
v0.49.0.2
September 30, 2026
Legacy demand letters no longer show a fake send action
FixApproved legacy demand letters no longer show a Send Letter button that did nothing. Sending remains available from the AI document editor, where the recipient is confirmed before the letterhead PDF is emailed and the send is recorded (GH #389).
v0.49.0.1
September 30, 2026
Litigation tab follows the case avenue
FixThe Litigation tab now activates when a case enters the Litigation avenue, and stage transitions keep the legacy litigation status in sync for older readers (GH #388).
FixThe unfinished scheduling-order AI upload is hidden by default so it cannot create fabricated court data and deadlines.
v0.49.0.0
September 29, 2026
Connect Clio
NewConnect Clio: firm admins can connect their Clio Manage account from Settings > Integrations, using the default app or their firm's own Clio app
SecurityClio tokens and firm app secrets are encrypted at rest, and the connection table is row-level secured per firm
v0.48.6.2
September 29, 2026
Uploading medical records no longer charges for a chronology
FixUploading medical records no longer charges the $150 medical chronology fee. The charge happens at Generate: only when you click Generate Medical Chronology, confirm the $150 dialog, and the chronology finishes. Previously the charge was booked as soon as uploaded records finished processing, including uploads from the Documents tab and a provider's Files tab, which showed no warning at all (HLC-021, HLC-022).
FixThe chronology is still charged once per case. A case that has already been charged sees a Regenerate dialog that says no new charge will be added, and a generation that fails is not charged.
v0.48.6.1
September 29, 2026
Stage required fields work again: nine stages no longer need Force Advance
FixNine stages (Liability Pending, Demand Prep, Demand Sent, Negotiations, Lien Negotiations, Disbursement, Settled, Pre-Suit Preparation and Case Filing) reported "Missing required fields" no matter what was entered, leaving Force Advance as the only way through. Each required field now reads the value the firm actually records.
FixTyping a value into the stage checklist pop-up now saves it. Insurance Company, Adjuster Email, Case Number and Court Name were being discarded on save, so the same fields came back missing.
ImprovedRequired values that are calculated from elsewhere on the case (medical expenses, liens, offers, attorney fees, net to client, settlement and demand dates) now say which tab produces them instead of offering a box that cannot be filled in.
ImprovedThree requirements that nothing in HoLaCe records (litigation budget, client expectations and the suit filing date) were removed from the stages that asked for them; they remain checklist items.
v0.48.6.0
September 29, 2026
Settlement figures are saved, and the disbursement statement matches the Settlement tab
FixThe Settlement tab now saves its figures: recording recoveries, fees, liens, bills or expenses keeps the journey's settlement amount and its settlement record up to date, so firm revenue and operations reports include settled cases.
FixThe disbursement statement and the Settlement tab now run one calculation. A per-recovery fee % prints on the statement exactly as the tab shows it; when recoveries carry different rates the statement lists one fee line per recovery.
FixWhen a statement cannot be generated (no agreed fee rate, or the payment table does not balance), the reason is shown instead of "PDF generation failed".
ImprovedEach generated disbursement statement is stored with the journey's documents and recorded on its activity timeline.
v0.48.5.4
September 29, 2026
Insurance details now save
FixThirteen insurance fields on the Edit Case drawer (policy numbers, adjuster title, address, city, state and ZIP for both the first-party and third-party carriers, and the third-party claim report date) were accepted by the form but never written to the case, so they showed as blank after every save. They now persist, and a test guards that every field the update form accepts is actually saved (GH #385).
v0.48.5.3
September 29, 2026
Cases no longer jump into Litigation on their own
FixReaching Demand Sent or Negotiations no longer moves a case into Litigation automatically. Most prelitigation cases settle after the demand goes out, and the automatic jump made the Negotiations, Lien Negotiations, Disbursement, and Settled stages unreachable. Entering Litigation is now an explicit stage change; the Hired gateway still crosses into Prelitigation once the contract is signed (GH #384).
v0.48.5.2
September 28, 2026
Bug reports are scoped to your firm
SecurityThe bug tracker now shows a firm only its own reports — listing, detail, search, editing, and deletion are all scoped to the reporting organization. HoLaCe staff still see every firm. Previously (a beta-era default) every user could see, edit, or delete any firm's reports, including journey links and screenshots.
v0.48.5.1
September 27, 2026
Chronology extraction failures are no longer silent
FixWhen the AI provider fails on every extraction batch of a medical record, the record is now marked ERROR with the provider message instead of quietly completing with zero entries. Previously an exhausted provider quota let six records show as processed while the chronology contained nothing (GH #383).
v0.48.5.0
September 27, 2026
Signing-packet merge fields and co-counsel
NewFirm signing documents now merge case data automatically at send time: the client's full name, date of accident, and co-counsel details flow into matching template fields (full_name, date_of_accident, co_counsel_firm, co_counsel_name) on every send path — the per-document send and the intake packet alike. Templates without those fields are unaffected.
NewNew Co-Counsel Firm and Co-Counsel Attorney fields on the journey (Edit Journey → Legal & Case Details) for joint-venture cases — they merge into the joint-venture contract when the signing packet goes out.
v0.48.4.0
September 21, 2026
Mark the statute of limitations satisfied
NewWhen suit has been filed and the defendant served, the SOL deadline no longer applies — a new "SOL satisfied" checkbox on the journey (Edit Journey → Legal & Case Details) stops every statute-of-limitations warning for that case: the dashboard red flag, the critical alert banner, and the deadline cues in The Grounds. The date stays on the record, and marking it is audited with who and when.
FixImported case expenses now land on the journey's Expense tab — where the settlement tab and disbursement statement read them — instead of being parked invisibly in the activity log. Re-importing the same expense file never duplicates entries.
v0.48.3.0
September 9, 2026
Medical bills table lines up; claim numbers on imported matters
FixThe Medical Bills table on the Damages tab now keeps every column title directly over its data at any screen width. On wide monitors the columns stretched until headers drifted off their values; the table now uses fixed column geometry and stays a readable block instead of spanning the whole screen.
FixClio's "Third-party Claim #" and "First-party Claim #" custom fields now land in the native claim-number fields on imported matters. All 227 imported DFox matters carrying claim numbers were corrected in place, and future imports map them directly.
v0.48.2.0
September 4, 2026
A disbursement statement never assumes a fee rate
SecurityGenerating a disbursement statement for an imported matter that carries no contingency rate now blocks with "no fee agreement rate on file" instead of silently assuming a default — a plausible-looking statement with a rate the client never agreed to is the most dangerous kind of wrong. Rate-less imported matters require the rate from the signed fee agreement to be set first.
FixThe platform's built-in fallback percentage can no longer reach any disbursement statement: if a journey has no rate and the firm has configured no default, generation blocks with a clear message rather than using a hardcoded number.
v0.48.1.0
September 4, 2026
Disbursement statement balances to the penny; demand-letter billing is one-time
FixDrafting a demand letter more than once no longer bills the journey again. The demand-letter service is now a one-time charge per journey — the first draft bills, and every redraft and re-export after it is free. Previously each draft iteration created another non-removable $150 charge on the expense tab.
ImprovedFirm administrators can now remove a HoLaCe-generated platform charge from a journey's expenses; removing one also voids the matching pending billing record, so the expense tab and the platform invoice always agree.
ImprovedWhen a signing link expires or a signer declines, the document's row on the E-Sign Timeline now offers a Resend button right there — the resend capability existed, but the fix wasn't offered where the problem was shown.
FixThe payment table on the disbursement statement was short by exactly the case-expense total: expenses were deducted from the client's recovery but assigned to no payee, so the firm was never reimbursed for advanced costs and the difference sat unexplained in trust on every settled file. The table now carries a distinct "Case Expense Reimbursement" payee line to the firm — separate from the attorney fee, since fee income and cost recovery carry different tax treatment.
NewEvery disbursement statement now prints a payment-table TOTAL row and an "Unpaid Proceeds" tie-out line — gross recovery minus every payment listed. Disbursement of client proceeds is complete exactly when that figure reads zero, making any imbalance visible on the document itself.
ImprovedA statement whose payment table does not account for the full gross recovery now refuses to generate with a precise explanation, instead of producing a document that quietly moves the wrong amounts. Provider-bill and lien totals also now use the same per-row math as the statement's printed detail rows (recorded post-adjustment amounts are honored), so the summary always agrees with the rows beneath it.
v0.48.0.0
August 25, 2026
Self-serve data import that actually imports
FixThe data import wizard failed with "No valid files could be parsed" whenever a CSV's columns didn't exactly match the expected Clio export format, with no way forward. Files the wizard doesn't recognize can now be imported anyway: tell it what the file contains (contacts, matters, notes, …) and map each column to a HoLaCe field yourself using the same drop-down mapping screen recognized files use.
NewMyCase contact exports import out of the box. The wizard recognizes MyCase's people and companies files automatically, maps names, emails, phones, addresses, notes, and contact categories, and safely skips contacts that already exist — matching by email, then name and phone — so running the same import twice never creates duplicates.
NewPlatform admins can now run an import on a firm's behalf from the admin console: pick the firm, upload their files, and the data lands in that firm's account with the import recorded against the admin who ran it.
FixUploading two files of the same kind — such as Clio's separate open and closed matters exports — silently imported only one of them. Both now import.
ImprovedThe import screen now reports progress and completion accurately — running imports show live record counts, and the summary at the end reflects what was actually imported, skipped, and failed.
v0.47.2.2
August 24, 2026
Bug reports show the date they were filed
FixEvery row in the bug tracker read "Invalid Date" where the report date should be, so there was no way to tell a bug filed this morning from one that had been sitting open for two weeks. The dates are back.
v0.47.2.1
August 24, 2026
Signing notifications actually fire
FixWhen a client finishes signing all of their intake documents, the assigned attorney and paralegal (or the firm admins) are now actually notified, and the intro-call task is actually created. The code for both existed but was loaded in a way the production build silently could not resolve, so neither ever ran. This was the last missing piece of the "no notifications on signing" report.
v0.47.2.0
August 22, 2026
The garden shows local weather now
NewThe ground itself now tells you where the work stands. A cluster of matters that has gone quiet gets a drier, stiller corner of the garden — the grass dims and stops swaying there until someone tends them. A bed where nearly everything is healthy earns a few pale butterflies drifting over it by day. And a matter whose statute-of-limitations season is inside 90 days keeps a small warm candle burning beside it after dusk — quieter and earlier than the glowing bud, which still marks the final 30 days at the plant itself. The sky and the weather stay the same for everyone: these cues are local, bounded, and always gentle.
v0.47.1.0
August 20, 2026
The Grounds gets the whole window
ImprovedOpening the Garden now collapses the side navigation to its icon rail and gives the world the full height and width of your window — no more dashboard chrome squeezing the view. Leaving the Garden puts the navigation back exactly as you had it.
FixThe Garden's music and the Wood Sprite's voice now stop when you leave the page. They kept playing over the dashboard after navigating away; the world now goes quiet the moment you step out of it.
v0.47.0.0
August 20, 2026
The Grounds — your practice as a living garden
NewHoLaCe has grounds now. Open the Garden from your dashboard and walk a living world where every plant is one of your matters: the species is the kind of case, its growth is real progress through its avenue, and a thirsty plant is one that has been quiet too long. Settled matters stand in a golden Grove; matters that closed in good order rest in the Quiet Archive; prospects that did not qualify enrich the Compost Corner. A Wood Sprite greets you at the gate, keeps a quest log of what needs attention, and will walk you to any matter that asks after you. Advance a matter in HoLaCe and the world responds — new matters sprout, milestones bloom, and a settlement is carried through the Grove gate with a ceremony. Click any plant to open its full record. Nothing in the garden is invented: it is your real docket, drawn as a place.
ImprovedThe garden holds a steady frame on ordinary hardware: distant plants render as lightweight silhouettes, celebrations are bounded so a busy Monday cannot stutter the world, and the whole scene sleeps when nobody is looking at it.
v0.46.1.0
August 20, 2026
One format for phone numbers and SSNs, and signatures that land where they belong
ImprovedPhone numbers now format themselves as (555) 555-5555 as you type — on the client intake form and everywhere else a phone number is entered or shown. Numbers pasted with a leading +1 are understood instead of being mangled. Social Security numbers format as 123-45-6789 while typing, are stored as digits only, and display masked to the last four digits with a reveal available to firm admins and attorneys.
FixSignature and date fields on generated retainers and HIPAA authorizations are now anchored to the signature line inside the document itself, instead of being placed at fixed coordinates on a guessed page — which is why signatures kept landing in the wrong position on documents whose length differed from the template the coordinates were tuned for.
ImprovedDollar-amount fields on the client intake form format with commas as you type.
v0.46.0.0
August 19, 2026
Invoices from the billing panel, and an admin panel that tells the truth end to end
NewThe admin billing page now has a Create Invoice section listing every firm with pending charges. Opening a firm produces a print-ready invoice — letterhead, line items, totals — that prints or saves as a PDF straight from the browser, with a one-click "mark as invoiced" that updates the ledger to exactly what was put on paper.
NewSupport can now click "View as owner" on a firm's detail page to see the product as that firm's owner — resolving the recorded owner first, with sensible fallbacks — instead of hunting through the user list. Same audited, time-limited masquerade underneath.
ImprovedActive Organizations on the platform dashboard now counts firms with case activity in the last 30 days. It previously counted active subscriptions, of which there are none, so it always read zero.
ImprovedRevenue figures across the admin panel are now labelled "Firm Recoveries" — that money is settlement revenue firms recovered for their clients, not HoLaCe income. The firm performance metrics firms see also now measure real firm revenue on real disbursement dates rather than gross settlement guesses, and dashboard cards show a dash instead of a made-up $0 when data has not loaded.
SecurityAn internal admin endpoint was returning more account detail than the pages using it needed, including one-way password hashes that, while not reversible into passwords, had no business leaving the server. It now returns only the fields the admin pages display.
FixIf recording a document charge fails while generating a demand letter or chronology, the failure is now logged loudly for follow-up instead of disappearing — the document still generates either way.
v0.45.5.0
August 19, 2026
Investigation volume is visible per firm and per provider
NewThe law firm list now shows how many investigations each firm has ordered, so you can see at a glance who is actually using investigation services.
FixService providers showed "0" jobs no matter how much work they had done. The figure came from a stored counter that only moves for a type of assignment investigations never use, so an investigation firm that had completed 98 jobs still read zero. It now counts the investigations themselves.
v0.45.4.0
August 19, 2026
The admin panel counts cases again
FixEvery case figure in the platform admin area was reading a retired table that holds no records, so total cases, active cases, the per-firm case column, and the case distribution chart all showed zero or came back empty — while the platform was in fact running 1,498 journeys, 441 of them active. They now count journeys, which is where the work has actually lived since the Avenue system replaced the old case model.
ImprovedThe case distribution chart now shows where open work actually sits — Prospect, Prelitigation, Litigation, DNQ — with closed matters as their own slice, instead of the retired status list.
ImprovedCase Resolution Rate now reads "Not measurable yet" instead of 0%. Most closed matters predate the close-reason field, so any percentage would describe how often that field is filled in rather than how often firms resolve cases. It will show a figure once enough closures record a reason.
v0.45.3.1
August 19, 2026
Invitation links now land on the site, not an internal address
FixThe invitation fix released moments earlier sent people to an internal server address instead of holace.io, so the link still did not work. Invitation links now go where they should.
v0.45.3.0
August 19, 2026
Team invitations can actually be accepted
FixInvitation emails sent to team members pointed at a page that does not exist, so clicking "Accept" landed on a "page not found" error and there was no way to join the firm. The invitation itself, the role and the firm assignment were all being recorded correctly — only the link in the email was wrong. Unexpired invitations already sitting in inboxes now work too. Invitations older than seven days have expired and still need to be re-sent.
v0.45.2.0
August 19, 2026
The firm list no longer takes down the database
FixOpening Law Firm Management fired roughly 1,400 database queries in one request — two for every organization on the platform. On production that single page load could exhaust every available database connection, locking out new logins and tools while the page itself died and showed zero firms. The same information now comes from three metric queries plus the agreement lookup — a fixed handful regardless of how many firms exist.
FixFirm monthly revenue now counts settlements from the current case system as well as the legacy one. Firms working entirely in the new system showed $0 revenue on the admin firm list regardless of what they actually settled.
ImprovedWhen the firm list genuinely fails to load, the page now says so with a red banner instead of showing zero firms, $0 revenue, and an empty table — which looked identical to a platform with no customers.
v0.45.1.0
August 18, 2026
The admin dashboard only reports what it can measure
FixOrganizations, users and revenue on the platform dashboard now show a real comparison against the previous 30 days. The percentages there before were fixed decorations that never changed no matter what the platform did. When there is no earlier period to compare against, the card shows no percentage at all rather than inventing one. Active Cases deliberately carries no comparison: the system does not keep the history needed to compute an honest one, and the only approximation available could never report a decline.
FixThe System Status card now checks the platform before it says anything. It calls the health check, reports the database from a live query with the measured response time, and reports the API from how long that call actually took. While the check is running the card is blank, and if the check cannot be reached the card turns red and says so. Previously it displayed three permanent green lights that were typed into the page and would have kept saying "Operational" during a full outage.
FixRemoved the "Email Service: Active" line from that card. Nothing was ever checking email delivery, so the line could only ever be a guess.
FixGrowth percentages on the Analytics page were computed with the wrong formula and could report a drop while a number was climbing. A period that grew from 100 to 120 firms now reads 20%, not -80%.
FixSystem Health no longer shows an "Errors (24h)" figure that was always zero because nothing recorded errors, and the API panel no longer claims to be healthy by default — it reports the health check's measured round trip and grades itself on it. The "Failed Requests" figure was really a count of expired login sessions and is now labelled that way.
ImprovedA firm's Billing tab now says billing history is not wired up yet, instead of "No billing history available", which read as though the firm had never been invoiced.
ImprovedRemoved an unused copy of the admin dashboard and its unused data endpoint that no page had loaded since a restore last year, so future work does not get spent on the wrong file.
v0.45.0.0
August 18, 2026
Support staff can view the product as a firm user
NewPlatform admins can now masquerade as a firm user from Admin → Users, and see exactly what that person sees. Previously the only way to reproduce a firm's problem was to log out and sign in as someone else, which meant sharing credentials.
NewWhile masquerading, a red banner across the top of every page names the person and firm being viewed and who is doing the viewing, with an "Exit masquerade" button that returns you to your own admin account in one click.
SecurityMasquerading is limited to super admins, cannot target another platform user or a deactivated account, expires on its own after 60 minutes, and does not extend itself with activity the way an ordinary login does. Every session is recorded — who viewed whom, for which firm, and when it started and ended.
SecurityFixed a page under the journeys import route that ran an unfinished auth check left over from the login migration and let any request through. It now validates the session like every other dashboard page.
v0.44.3.0
August 17, 2026
Signed-document counts tell the truth, and blocked stages say why
FixThe "signed" badge on a journey now counts the documents you actually sent, instead of always counting out of three. A two-document packet reads "1 of 2" and can reach "2 of 2" — previously it showed "1 of 3" and could never complete, which also made it look like a document was missing when it was never part of the packet.
FixA document signed through the e-signature link now shows up in that badge right away. The count and the automatic stage advancement read the same records, so a journey can no longer move to "Partially Signed" while the badge still reads "0 of 3".
FixWhen a stage cannot be entered yet, the Change Stage dialog now says so plainly and names what to do instead — for example, sending the intake packet before moving a journey to Documents Sent. Previously these appeared as an ordinary warning offering "Force Advance", which then failed, making it look like the journey simply could not be moved backwards.
v0.44.2.0
August 13, 2026
Growth
NewPlanted something small. ♥
v0.44.1.0
August 7, 2026
Agreement signing applies to new firms only
FixTurning on Master Service Agreement signing now applies only to firms created from that point forward. Firms already using HoLaCe are never asked to sign, and the admin settings card shows the effective date and how many existing firms are exempt.
v0.44.0.0
August 7, 2026
Firms provision automatically from the onboarding portal
NewCompleting the onboarding questionnaire now creates the law firm in HoLaCe at the click of a button: the firm and its admin account are set up, the Master Service Agreement goes out for signature, and the owner receives their sign-in invitation. A new Provisioning page in the admin area shows every attempt with any missing information flagged for follow-up.
FixOwner invitations sent from the admin panel now sign the owner into their existing firm. Previously clicking one failed with a verification error and left the account unusable.
ImprovedEmail addresses are stored consistently in lower case so an account can never become unreachable at sign-in because of capitalization.
v0.43.0.0
August 7, 2026
Firms e-sign their Master Service Agreement during onboarding
NewNew firms now review and e-sign the HoLaCe Master Service Agreement through DocuSeal as part of onboarding, with a signed-copy link and a completion certificate recording who signed, when, and from where. Firms that already signed the beta agreement are unaffected.
NewSuper admins can author the MSA in the DocuSeal template builder from Admin → Settings, see each firm's agreement status at a glance in the firms list, and resend an unsigned agreement from the firm detail page.
FixFirm owner invitation links now stay valid for 7 days instead of expiring after 15 minutes.
SecurityDocument template editing tokens are now scoped to the requesting firm, and platform agreement templates require super-admin access.
v0.42.2.0
August 7, 2026
Policy-limits demands and disbursement acknowledgement
FixDemand letters drafted without policy limits on file now demand the full available policy limits plus written disclosure of all coverage, instead of stating a dollar figure derived from incomplete damages (which could read as low as $0 in early prelitigation).
FixThe Stowers adjuster-address warning no longer fires on every letter — it now reads the third-party policy limits actually saved on the journey.
ImprovedThe disbursement statement now closes with a full client Acknowledgement section (hold-harmless, unlisted-expense responsibility, indemnification, fee explanation, tax disclaimer) above the signature lines.
v0.42.1.0
August 7, 2026
More practice areas for journey tagging
FixThe Practice Area field now offers ten additional options (Family Law, Criminal Defense, Employment Law, Immigration, Real Estate, Business Law, Bankruptcy, Workers' Compensation, Medical Malpractice, and Other) so off-vertical leads can be tagged accurately before disqualification instead of being miscategorized.
v0.42.0.0
August 6, 2026
Re-scan just the flagged pages of a medical record
NewWhen the scanner flags specific pages of a medical record as uncertain, you can now re-scan only those pages from the record menu instead of reprocessing the entire document. Faster, gentler on your data, and no extra charges.
v0.41.1.0
August 5, 2026
AI demand drafts got dramatically faster
ImprovedThe AI now writes several sections of a demand letter at the same time instead of one after another, cutting a full draft to well under a minute while keeping the sections in their proper order.
v0.41.0.0
August 5, 2026
Every scanned page now carries a real confidence score
NewMedical record scanning now measures its own certainty on every page — including spotting a single garbled region inside an otherwise clean page — instead of guessing from how much text came back. Pages the scanner is unsure about are flagged on the record so nothing slips through quietly.
NewScanned pages are also checked against medical common sense: dates that cannot exist, dosages outside plausible ranges, and tables that lost their structure all raise a visible flag for review.
v0.40.0.1
August 5, 2026
Scanning reliability follow-ups
FixPages that fail to render from a PDF now count toward the scan-failure check, so a record can no longer complete quietly while some pages were never scanned at all.
FixThe backup cloud scanner no longer mistakenly locks itself out when an unrelated error response happens to contain an authentication-looking code.
v0.40.0.0
August 5, 2026
Your custom demand templates now drive AI drafting
NewDemand letter templates built in the template builder now actually shape AI drafts. Pick your firm's template in the Draft with AI dialog and the AI writes each section following your per-section instructions, instead of the built-in defaults.
NewTemplate letterhead, fonts, and your signature block now carry through to the exported PDF and Word versions of template-driven drafts. If a template has no letterhead uploaded, your firm branding is used as before.
SecurityTightened the template list so templates from other firms can no longer appear under unusual filter combinations.
v0.39.1.1
August 5, 2026
Faster AI demand drafts
ImprovedAI demand letter drafting now completes noticeably faster, so drafts finish while you watch instead of asking you to check back in a minute.
v0.39.1.0
August 5, 2026
Medical record scanning is now resilient to busy periods
FixUploading several scanned medical records at once no longer risks pages being silently skipped. Scanning is now paced, each page automatically retries if a first attempt fails, and a backup cloud scanner takes over if the primary is unavailable.
ImprovedIf most of a record's pages still cannot be scanned, the record is now clearly marked as failed with a Reprocess option, instead of quietly completing with missing content.
ImprovedThe scanning service is now monitored around the clock, so outages are caught by alerts instead of by missing data in a chronology.
v0.39.0.0
August 5, 2026
Firm Operations report in the admin panel
NewPlatform admins get a new Firm Operations report: pick any firm and see every case with its investigation status, demand letter status, amounts, and a derived billing status, plus summary counts. The whole report exports to CSV with one click, so operational and billing reviews no longer require a developer.
ImprovedThe Export button on the Platform Analytics page now actually downloads the analytics data as a CSV. It previously did nothing.
v0.38.1.0
August 5, 2026
Demand drafting restored, plus dashboard and investigation fixes
FixDrafting a demand letter with AI works again. Since late July, drafts were failing every time with a vague "may still be finishing on the server" message — the drafting engine had been switched to a backup AI server that could not keep up. Drafting now runs on a fast provider again, and if a draft ever does fail, the error tells you what actually went wrong instead of guessing.
FixThe firm dashboard Revenue tile now reflects the attorney fees your firm has actually realized. Cases closed as Settled/Disbursed count toward Revenue in the month they closed, so the number moves when you settle a case instead of sitting still.
FixNotes and special requirements entered when creating an Investigation Request now stay visible to the investigator. A permanent "Instructions from Requestor" section shows on both the investigator dashboard and the investigation form, so instructions no longer disappear after the first save.
FixThe "Reprocess" option on a processed medical record now works. Previously it always failed with a status error, which blocked re-running records after an upload processed with poor scan quality.
v0.38.0.0
July 30, 2026
HoLaCe is now a desktop app for Mac and Windows
NewYou can now install HoLaCe on your computer instead of working out of a browser tab. It runs in its own window with its own icon in the Dock or taskbar, so the case you are working stays put when you switch between other apps, and you can launch straight into it without hunting for the right tab.
NewA new download page gives you the Mac and Windows installers along with the current version number, so everyone at the firm can get set up without asking IT for a link.
ImprovedThe desktop app signs you in and shows the same cases, documents, and dashboards as the website. Nothing is stored only on your computer, so you can move between the desktop app and a browser on any machine and pick up exactly where you left off.
ImprovedDesktop installers are now produced by an automated release build, so each version is packaged the same way every time and new releases can go out without a manual build step.
v0.37.2.0
July 29, 2026
Demo cases now read like real, worked files
ImprovedEvery case in the demo account now tells a complete story instead of sitting empty. Each one shows the stages it moved through with dates, the activity trail behind those moves, an assigned attorney, and a realistic task list with a mix of finished, open, and cancelled items.
ImprovedCase detail matches where the case actually is. Files in treatment show medical providers, bills, and a completed chronology; files at demand show a generated demand letter with the negotiation back-and-forth; settled files show the recovery and a disbursement breakdown that adds up.
ImprovedThe demo sandbox site now carries 30-60 cases per firm across the full stage pipeline, and rebuilds identically on every weekly reset so demos are repeatable.
FixRepaired the database seed command, which pointed at a file that was never in the repo.
v0.37.1.2
July 27, 2026
COO AI assistant and demand drafting now run on local AI infrastructure
ImprovedThe COO AI assistant and AI demand-letter drafting now run on HoLaCe's own local AI infrastructure instead of a third-party cloud API, improving reliability. The assistant's behavior, tools, and responses are unchanged.
v0.37.1.1
July 27, 2026
Demand letters are billed once per letter
FixDemand letter generation is now billed once per distinct letter. Previously only the first demand letter on a case was billed and any additional letters were not, so firms were undercharged. Re-exporting or retrying the same letter (for example generating both a PDF and a DOCX of one letter) is still billed only once.
v0.37.1.0
July 27, 2026
Fixes: blank e-signature viewer, demand-letter generation errors, and RED case counts
FixClient e-signature page now shows the actual document to review and sign instead of a blank viewer, and the "I've finished signing" button stays disabled until you have opened the document and the signature is confirmed against DocuSeal — so an unsigned document can no longer be marked complete.
FixAI demand-letter generation now fails cleanly. When a draft cannot be created it says so plainly and confirms nothing was charged, instead of an ambiguous "may still be finishing on the server" message. Generation is now time-bounded and failures are captured with a reference id so support can trace them.
Fix"RED case" now means one thing everywhere: the dashboard count and the COO AI assistant use the same definition — an active case with no activity in 30+ days, an overdue task, or a statute-of-limitations deadline within 30 days — so the attorney RED count and the assistant's list finally agree. The definition is shown on the dashboard.
FixThe COO AI assistant now finds cases by their journey number (for example "JRN-000524"), not only internal IDs, so it no longer reports "journey not found" for a case that exists.
v0.37.0.3
July 26, 2026
Change Stage warnings now name the missing fields
ImprovedThe "Missing requirements" warning when changing a journey stage now lists exactly which required fields are missing (e.g., "Missing required fields: Date Of Incident, Settlement Amount") instead of a generic message — no more hunting across the journey to find what's incomplete.
v0.37.0.2
July 25, 2026
Fix: intake packet silently dropped the retainer and HIPAA authorization
FixSending the Intake Packet could deliver only the intake form while the retainer and HIPAA authorization failed silently behind a success message — and the journey still advanced to "Documents Sent." Fixed end to end: the e-signature PDF generation now waits for the document to be ready (the root failure), a partial send keeps the journey in place and shows exactly which documents did not go out, and clicking Send again delivers only the missing documents — clients never receive duplicates.
ImprovedThe send dialog now stays open on any failure with a per-document breakdown instead of closing behind a toast.
v0.37.0.0
July 24, 2026
Journey Close-Out: close cases deliberately, with dispositions — and an honest Active count
NewJourneys can now be CLOSED — deliberately, by you, never automatically. Close from the Change Stage dialog ("Close journey…") or by dragging a card to the new Closed lane on the board. Every close records a disposition: DNQ, NSQ, Lost/NFA, or Referred Out on the marketing side; Settled/Disbursed, Released, or Withdrawn on the case side.
NewBulk "Close all" on prospect buckets (DNQ / NSQ / Lost columns) — clear hundreds of terminal prospects in one confirmation instead of one card at a time.
NewNew Closed Cases view (Journeys → Closed): every closed journey with its disposition, close date, and a one-click audited Reopen.
Improved"Active" now means exactly not-closed, everywhere — Active Journeys, Active Leads, Conversion Rate, Journey Distribution, and Cases This Month are all computed over coherent populations; settled/disbursed cases count in historical metrics, not active ones.
SecurityConflict checks now include closed and archived journeys (previously they silently skipped them — a conflict with a closed case is still a conflict). Locked in with a permanent regression test.
NewHot / Warm / Cold priority on active prospects — a triage chip on the card, list, and journey header, separate from close-out dispositions.
v0.36.1.1
July 24, 2026
Template builder: upload your firm logo directly
ImprovedThe template builder's letterhead image block now has a real "Upload image" button (PNG/JPEG/GIF/WebP/SVG, up to 10MB) with a live preview — no more needing a hosted image URL. Pasting a URL still works as an alternative.
v0.36.1.0
July 24, 2026
Beta feedback wave: AI demand drafts now visible, team invites fixed, currency formatting
FixAI-drafted demand letters were generated and billed but never appeared anywhere in the app. The journey Demand Letters tab now lists AI drafts (click one to open the editor), and a lost connection during the 1–2 minute draft no longer strands a finished draft invisibly.
FixSuccess and error notifications across the entire dashboard were silently invisible (the toast layer was never mounted). Every action now gives visible feedback — this was the root of several "nothing happened" reports.
FixInviting a team member always failed with "An unexpected error occurred" — a placeholder invite token collided with a database uniqueness rule on every invite after the platform's first. Invites now work, and re-inviting the same email resends instead of erroring.
FixFirm Writing Style uploads: choosing files one at a time replaced the previous pick, making the 3-letter minimum unreachable. Picks now accumulate with per-file remove, clearer errors name the problem file, and legacy .doc files get an actionable "re-save as .docx" message instead of a crash.
ImprovedCurrency fields on the Damages, Settlement, and Negotiation tabs now format with thousands separators live as you type (1234567 → 1,234,567).
FixBilling → Itemized Charges table columns no longer drift out of line with their headers in the narrow settings pane.
ImprovedBug-report screenshots are now stored durably (they previously lived on disk that was wiped by every deploy; all 132 historical screenshots were preserved and migrated).
v0.36.0.1
July 22, 2026
Fix: medical-record uploads failing with a processing error
FixMedical-record PDFs whose extracted text contained a NUL byte would fail to process with an error (and reprocessing hit the same error). The extracted and OCR text is now sanitized before saving, so those PDFs process normally.
v0.36.0.0
July 22, 2026
Help Center: in-app step-by-step how-to guides
NewNew Help Center (sidebar → Help Center) with searchable, categorized how-to guides. First guide: turning medical-record PDFs into an AI chronology and a demand letter that cites it, step by step with screenshots.
NewGuides support paired video walkthroughs — a written how-to and its video live together on one page.
ImprovedRenamed the old "Help & Support" sidebar link to "Support Tickets" so it no longer collides with the new how-to Help Center.
v0.35.1.0
July 21, 2026
Templates: one unified builder (retired the duplicate Letter Templates link)
ImprovedRemoved the legacy "Letter Templates" sidebar link and standalone page that duplicated the new Templates builder and caused confusion. Demand-letter templates now live only in the unified Templates builder; the old route redirects there.
v0.35.0.0
July 15, 2026
Medical chronology: encounter segmentation, self-hosted OCR support, and demand letters that cite the record
NewCombined medical-record PDFs are now segmented into discrete encounters and document types before AI extraction — multi-provider treatment courses no longer collapse into a single entry.
NewDemand letters now draw on the medical chronology: injury and damages sections cite specific dated entries (provider, date, source page) and never assert medical facts absent from the record; the chronology is listed as an enclosure.
NewSelf-hosted GPU OCR support: the local OCR provider now authenticates with a bearer token, and scanned-page OCR infrastructure (poppler) ships in the deploy image.
ImprovedWhen scanned pages cannot be OCR’d, the record now carries an explicit extraction warning instead of silently producing an incomplete chronology.
v0.34.4.0
July 19, 2026
AI gateway: neutral User-Agent so self-hosted inference endpoints are reachable
FixThe AI gateway now sends a neutral User-Agent on OpenAI-compatible calls, so self-hosted, Cloudflare-fronted inference endpoints (e.g. the local Gemma models) are no longer blocked by AI-bot filtering. No change to OpenAI or Anthropic routing.
v0.34.3.1
July 18, 2026
Homepage footer: correct Titanium Computing mark
FixUse the Titanium Computing dark brand tile in the footer (replaces an off-brand variant).
v0.34.3.0
July 18, 2026
Homepage footer: "A Titanium Computing product"
ImprovedAdded "A Titanium Computing product" footer line with the Titanium Computing mark, linking to titaniumcomputing.com.
v0.34.2.0
July 18, 2026
Homepage: Anthropic / Claude attribution
ImprovedAdded "Built on Anthropic's Claude" attribution with official Anthropic and Claude marks in the footer, and a "powered by Anthropic's Claude" line in the COO AI Agent section.
v0.34.1.0
July 15, 2026
Medical chronology trust floor — QC fixes from DFL review
FixChronology "Date Prepared" is now set from the system clock instead of being AI-generated (a hallucinated prep date could predate the date of loss).
FixPatient History, Executive Summary, Missing Records, and Comments sections now render their actual content in the viewer and exports — previously these read fields the generator never produced and showed blank under their headings.
ImprovedChronology sections now render fully or not at all: empty sections are omitted from exports instead of appearing as bare headings.
ImprovedSource citations are now ON by default (Standard page-number style) for new chronology generations.
v0.34.0.0
July 14, 2026
Pending Release & Released stages + firm data migration tooling
NewNew "Pending Release" stage (after Treating) and terminal "Released" stage in both the Prelitigation and Litigation workflows, for cases where no viable coverage is found.
ImprovedFirm data migration tooling: Clio + Lawmatics exports can now be imported with cross-source dedup (email or name+phone), closed-matter archival with full field retention, and prospect disposition routing.
v0.33.2.0
July 12, 2026
Uploaded files now stored durably
FixJourney documents, medical records, signed documents, and custom themes are now stored in durable cloud storage. Previously these files were lost whenever the platform deployed an update.
FixMedical record file downloads and deletions no longer fail with a permission error.
FixThe "Download Signed PDF" action in signature tracking now downloads reliably.
ImprovedFiles uploaded before this release that were lost to a past deploy now show a clear "please re-upload" message instead of a generic error.
v0.33.1.0
July 10, 2026
Magic link login emails restored
FixMagic link login emails were silently failing to send since July 9 due to an expired email API credential. The credential has been replaced and login emails deliver again.
FixEmail delivery errors returned by the email provider are now recorded as failures instead of being logged as sent, so outages like this surface immediately.
v0.33.0.2
July 6, 2026
Investigation photo GPS captured from device location on phone uploads
FixInvestigation photos taken on an iPhone now capture their location even though iOS strips GPS from photos during a web upload: the app uses the device location you grant in the browser and stores it with the photo when the file itself carries none. Location then shows on the firm's review screen and links to the map.
v0.33.0.1
July 6, 2026
Investigation photo metadata now visible to the reviewing firm
FixPhoto details (date taken, camera, and GPS location) that investigators capture on their phone are now shown to the firm when it reviews the submitted investigation. Previously this metadata was stored but never surfaced in the reviewer's photo gallery, so it looked like it was missing. Each geotagged photo now links straight to its location on the map.
FixCorrected GPS extraction so Western/Southern-hemisphere coordinates keep the right sign — previously a US firm's photo could pin to the wrong hemisphere because the latitude/longitude reference tags were dropped during extraction. New uploads are fixed automatically; a one-time operator backfill re-parses existing photos.
NewConfigurable onboarding packs: firms now choose exactly which documents make up a client's intake packet — the built-in retainer, HIPAA, and intake form plus any of their own saved firm documents — ordered how they like. Every journey shows a per-journey document checklist so staff can see and pick what actually goes out.
ImprovedFully firm-branded, mobile-friendly signing experience at /sign: clients no longer receive an unbranded DocuSeal email. Instead HoLaCe sends one branded "your documents are ready to sign" email that links to a white-labeled signing page carrying the firm's name and accent color.
NewE-sign completion certificates are captured on signing (timestamp, signer identity, IP, and the DocuSeal audit-log PDF) and are viewable directly on the journey's document timeline — the load-bearing E-SIGN/UETA legal artifact, no longer buried in DocuSeal.
ImprovedHoLaCe's standard documents are now visible alongside firm-owned templates in the document library, so every document a client might be asked to sign lives in one place.
ImprovedResend Intake Packet now runs on the same pack-driven flow as the initial send: it re-fires only the still-unsigned documents through the branded signing email (no more unbranded DocuSeal messages) and never creates a duplicate signature request for a document that was already sent.
SecurityThe new onboarding-pack tables and every pack, signing, and certificate path are auth-gated and explicitly organization-scoped as defense-in-depth on top of enforced row-level security, keeping each firm's packs, documents, and signed certificates isolated.
v0.32.0.0
July 3, 2026
Firm Document System — Phase 1 (builder, library, send backbone)
NewFirms can now build and save their own signable documents. Settings → Documents opens an embedded DocuSeal builder where a firm admin uploads a PDF or Word file and drags signature, initial, date, and text fields onto it — no more being limited to HoLaCe's two built-in retainer/HIPAA types.
NewA per-firm Document Library lists every saved template with create, edit (re-open the builder), and archive actions — all org-scoped so each firm sees only its own documents within the shared DocuSeal instance.
NewBackbone to send a firm document to a journey's client for e-signature: a new endpoint creates a DocuSeal submission from the saved template, emails the client, records the SENT event on the journey document timeline, and lets the existing webhook flow VIEWED/SIGNED status back.
SecurityThe new firm_documents table ships with an org-scoped row-level-security policy (ENABLE + FORCE + holace_app grant) in the same migration that creates it, matching the enforced tenant-isolation posture; every API route is auth-gated and org-scoped.
v0.31.0.0
July 3, 2026
Super-admin panel beta-readiness — every P0/P1 gap closed
FixLaw Firm Management works end to end: the firm list no longer 500s (the API now selects only the columns the UI needs), and a real "Create Firm" form onboards a new firm, its owner (firm-admin), a magic-link invite, and seeded lead sources — previously the page was a permanent "Form loading…" stub and firms could not be created at all.
FixUser Management write paths are live: super-admins can invite users, change a user's role, and activate/deactivate accounts. These actions previously targeted endpoints that did not exist and failed silently with no feedback.
FixContractor, Service-Provider, and Knowledge Base admin actions are wired up (suspend/delete, notes, category handling) and no longer throw 500s on missing enums or blank input.
FixBlog/CMS editors, Platform Settings persistence, Services catalog, and Billing rate configuration now save real data; Demand-tracking and other not-yet-built controls show honest "Coming soon" states instead of dead buttons.
FixAnalytics no longer fabricates numbers — revenue and plan-mix are aggregated from real records — and the dashboard, analytics, activity, and health pages render live data instead of loading stubs.
SecurityConverting a contractor to a platform user now grants the least-privilege PARALEGAL role instead of over-provisioning, and every admin write path enforces the super-admin permission check.
ImprovedRoughly 15 dead navigation links were pruned and global toast notifications added, so admin actions give consistent success/error feedback across the panel.
NewJourneys can now be classified by practice area (Personal Injury vs Estate Planning & Wills). Split-practice firms pick the practice area when creating a journey and switch buckets from a new dropdown on the Journeys page — estate-planning journeys flow through the same Avenue pipeline, just in their own bucket.
NewThe public "Book a Demo" form now asks how many cases the firm settles per year, so demo requests can be ranked by revenue potential before scheduling.
v0.29.0.0
June 26, 2026
Prompt caching for AI features — faster responses, lower cost
ImprovedThe AI COO assistant and the demand-letter drafting engine now reuse cached context on Anthropic instead of re-sending the same instructions on every call. Repeated tokens bill at ~10% of the normal rate, so multi-section demand letters and back-and-forth COO chats are cheaper and start responding faster.
ImprovedThe demand drafter routes through the native Claude API so caching actually takes effect (the OpenAI-compatible endpoint it previously used cannot cache); every section after the first reads the shared playbook/authorities prefix from cache.
FixCOO assistant moved off a retiring Claude model (claude-sonnet-4) to the current claude-sonnet-4-6.
v0.28.0.0
June 23, 2026
Beta agreement signed during onboarding
NewNew firms now review and electronically sign the HoLaCe beta user agreement as part of sign-up — one clean intake flow. The agreement wording is editable in-app by an admin, and the signed copy (signer name, version, timestamp, and signature image) is stored on the firm record. After signing, the firm owner lands directly in the dashboard.
FixNew-firm sign-up no longer routes through a dead /onboarding/complete page; owners go straight to the agreement step and then the dashboard.
v0.27.1.0
June 19, 2026
Fixed dead navigation links + new Medical Records and Document Library pages
FixSeveral sidebar links led to a 404 page. "Medical Records" and "Document Library" (under Medical & Documents) now open real pages, and "Import" (under Contacts) now opens the Data Import wizard (GH#265).
NewNew Medical Records page: a firm-wide view of medical bills, treatments, and providers across every journey, with totals (billed / paid / reductions) and search.
NewNew Document Library page: every firm document — case files, medical records, and evidence — in one searchable, filterable place with direct downloads.
Fix"Transition Stage" in the journeys list now opens the journey (where stage transitions happen) instead of a 404 page.
v0.27.0.0
June 17, 2026
AI Demand Engine — composed demand letters on Opus 4.8
NewNew AI Demand Engine generates structured demand letters from case data, composing a practice-area playbook + jurisdiction + your firm profile — drafted on Claude Opus 4.8. Two flagships live: California habitability and Texas car-accident PI.
NewIn-app entry point: pick the demand type + jurisdiction at generation time (no longer dependent on the journey case type), supply any attorney exposure inputs, then draft, edit/regenerate per section, and export.
NewCitations are search-grounded and verification-tagged (verified vs. needs-review) — never free-generated — with a reasoned, computed exposure/damages table rendered deterministically into the document.
NewDocument Branding designer (Settings → Branding → Documents): firm letterhead name/subtitle, accent color, body font, footer, and page-number toggle, rendered into generated DOCX/PDF demand letters.
ImprovedFirms can declare the states they practice in; the demand-type picker offers that firm’s jurisdictions × the available practice areas.
v0.26.1.0
June 17, 2026
Link referral sources to existing contacts on new journeys
NewNew Journey form: the Referral Source field now searches your existing contacts, so a referrer (provider, attorney, etc.) can be linked to a real Contact record instead of captured as free text (GH#258)
FixImport-from-Contact search now correctly populates client phone and email (was reading stale field names)
v0.26.0.0
June 15, 2026
Row-level security ENFORCED — database-level tenant isolation live
SecurityRow-level security is now ON and FORCED on all 136 multi-tenant tables in production, with the application running through a non-bypassing database role. Tenant isolation is now enforced by PostgreSQL itself as a second line of defense beneath the existing application-level scoping — even an unscoped query cannot return another firm's data. Rolled out wave-by-wave (Journey first) with verification at each step; login/auth tables are deliberately excluded so authentication is unaffected.
v0.25.0.0
June 15, 2026
Row-level security foundation (dormant — not yet enabled)
SecurityDatabase-level row security (RLS) infrastructure ships in this release but is intentionally dormant — every table-level enable/force is commented out and the per-request tenant role-switch middleware stays gated behind a flag that is off by default. Application behavior is identical to the prior release. This lays the groundwork for defense-in-depth tenant isolation enforced by PostgreSQL itself, to be turned on gradually under explicit operator control in a later, independently-revertible rollout.
ImprovedA new automated coverage guard fails the build if any multi-tenant table ships without a row-security policy, so future tables can never silently go unprotected.
ImprovedPer-wave enable/rollback SQL plus a synthetic multi-organization isolation-test harness were added to support a controlled, verifiable production rollout.
v0.24.0.0
June 12, 2026
Medical record uploads up to 500MB on durable storage
NewMedical chronology uploads now accept PDFs up to 500MB (previously 50MB) — real, full-size medical record sets upload without compressing first. Files go straight from your browser to cloud storage with a live progress bar.
ImprovedChronology source PDFs are now stored durably in cloud object storage — they survive every platform deploy and stay viewable from the record list indefinitely.
ImprovedRecord AI processing (text extraction, OCR, structured data) runs on the background worker with automatic retries instead of inside the web server, keeping the app responsive during large jobs.
FixOlder chronology records whose source PDF predates durable storage now show a clear "please re-upload" message instead of a generic file error.
NewFirm Writing Style (Settings → Firm Writing Style): upload 3–5 of your past demand letters and the AI learns your firm's voice — tone, structure, signature phrases, things you avoid — shows you a plain-English summary to confirm, then drafts every demand in that style. The engine never invents facts to match the style; missing information is still acknowledged honestly.
NewCarrier Scorecard on the Settlement tab: per-carrier negotiation intelligence built from your firm's own history — typical first-offer posture, settlement averages, lift from first offer to final, and resistance patterns — so you anchor against the carrier you're actually facing.
FixAdmin Users search works again; progress bars show real progress; Personal Injury lead conversion is no longer blocked; the COO chat excludes voided negotiation moves from money answers.
SecurityRemaining internal-error detail leaks sealed across 76 more API routes (5 code shapes the original sweep's pattern missed, including one streaming response) — completes the hardening started in 0.21.0.0. Clients always get a clean static message; full detail stays in server logs.
ImprovedAll AI calls now route through the unified provider gateway with exact-model preservation per task; the automated test suite is restored as a green release gate; browser-error monitoring verified live.
v0.22.0.0
June 12, 2026
Demand letters: DOCX export, send to carrier, engine-first drafting + modernized PDF stack
NewExport DOCX from the document editor: engine-drafted demand letters download as a Word document on firm letterhead (Letter size, legal formatting) — right next to Export PDF.
NewSend to Carrier from the document editor: email the finished letterhead PDF straight to the adjuster — recipient pre-filled from the journey's adjuster contact, an explicit confirmation step before anything sends, and the send recorded in the document trail and journey activity feed.
ImprovedCar-Accident demand drafting now routes through the AI document engine wherever an engine configuration exists — legacy creation is hidden there and untouched everywhere else. The cutover is config-driven, so new case types switch to engine-first by seeding their section graph, with no code deploy.
ImprovedPDF rendering engine modernized: all document PDFs (demand letters, disbursements, trust reports, generated documents) now render on a current Chromium (141) via Playwright, replacing the 2021 Chrome 93 stack — html-pdf-node and its bundled puppeteer removed entirely.
v0.21.1.0
June 11, 2026
Intake responses view + completion notes
NewStaff-facing Intake Responses panel on the journey E-Sign Timeline tab (GH#199): review the client's submitted intake answers — grouped by form section with empty fields skipped — right where the intake packet timeline lives. Answers are withheld until the client actually submits, so in-progress drafts are never shown as completed responses.
NewOptional completion notes when completing tasks and checklist steps (GH#201/GH#203): add context at the moment of completion and see it in the Case Notes / activity trail.
ImprovedTask edits and reopens now appear in the journey activity feed.
v0.21.0.0
June 10, 2026
AI Demand Letter — end-to-end (draft → edit → export PDF)
New"Draft with AI" entry point on the journey Demand Letters tab: one click drafts a complete demand letter through the AI document engine and opens it in the editor. Shown beside the existing "Create New" flow (which is unchanged), enabled only for case types with an engine configuration (Car Accident demands today, via the new availability endpoint), and behind a feature flag (NEXT_PUBLIC_DEMAND_AI_ENABLED, default on) so it can be switched off without a code deploy.
NewAttorneys now work the full path in-app: AI draft → 3-column editor (section navigation, trace-marked canvas, AI actions, version history) → finished letterhead PDF — no detour through the legacy generation flow.
NewLetterhead PDF export for engine-drafted documents: "Export PDF" in the editor renders the current sections onto the firm letterhead and downloads the finished demand letter (POST …/doc-engine/[documentId]/export). Export is not a charge path — the document was billed once at draft creation.
ImprovedStaging e2e golden path for the usable engine: Car-Accident journey → "Draft with AI" (availability-gated) → editor → letterhead PDF export, asserting real PDF bytes end-to-end.
SecurityAPI hardening: unexpected-error (500) responses no longer echo internal error details to clients across 29 API routes — clients get a static message; full detail stays in server logs.
New3-column document editor for engine-drafted documents (…/doc-engine/[documentId]/editor): graph-ordered section navigation with per-section save state on the left, the editable canvas in the center, and an assistant rail (AI actions, variables, suggestions, version history) on the right.
NewTipTap editor canvas with the trace-mark layer carried through edits: {{path}} references render as non-editable variable pills, AI-drafted sentences keep a dotted trace underline, and clicking an underlined sentence opens a provenance popover (source label / field path / confidence / linked value, with Verify and Remove-mark controls). Saved content is always clean serialized HTML — pills and underlines never leak into the document.
NewSection-level AI actions — Rewrite, More aggressive, Soften, Shorten, Add citations — re-draft the active section through the AI gateway under the pinned trace-mark contract, with unsaved edits flushed first so the model always sees the latest text.
NewAuto-save and document versioning: edits debounce into per-section saves (with visible idle/pending/saving/saved/error status), every AI action snapshots the pre-action state, and any version can be restored from the history panel — restore itself is snapshotted, so nothing is ever lost.
Improved"Open in editor" link on the doc-engine preview page, and the staging e2e golden path extended to cover the full editor flow (draft → edit → auto-save → AI rewrite → version restore → preview).
v0.19.1.0
June 10, 2026
Bug-squash wave: beta-tester batch (BirdTesting)
FixSettlement breakdown: corrected net-medical and balance-owed math so reductions and payments reconcile in the client breakdown.
FixDemand amount: single source of truth across the demand views, with the settlement-gap calculation derived from it instead of a second stored copy.
FixDemand letters: validation no longer raises false-positive warnings on complete letters, and "Create New" works from the demand-letters list.
FixAI medical-bill extraction: confirmation workflow before extracted bills are committed to the case, so staff review AI-read amounts instead of silently trusting them.
FixMedical providers: records/bill status badges now reflect actual request state, and "Mark Received" updates the provider row immediately.
FixE-sign: a journey with at least one signed intake document now auto-advances from Documents Sent to Partially Signed. In-app intake-form submissions now record the signature event that drives stage automation, so the pipeline badge count and the stage no longer disagree.
FixGH#208: the bug-report button (bottom-right) stays clickable while a modal dialog is open — reporting a bug no longer requires dismissing the very state being reported. The open modal stays open and is now included in the captured screenshot.
FixGH#199 (display): E-Sign Timeline event rows now use card-paired text tokens, fixing illegible text on firm themes where the card surface is darker than the page (dark-navy-bar effect).
FixTasks: task activity (create/complete/assign) is logged to the journey activity feed.
v0.19.0.0
June 9, 2026
AI Document Engine — engine slice 1 (Demand · Car-Accident)
NewAI gateway (lib/ai/gateway): one OpenAI-compatible choke point for every LLM call, with per-task provider/model/JSON-mode config via environment (draft_final / draft_bulk). Works against OpenAI, Anthropic-compat, or self-hosted endpoints with zero code change; strict-JSON drafting is zod-validated with a one-shot repair retry.
NewPer-section AI drafter with trace marks (lib/services/doc-engine + POST /api/avenue/journeys/[id]/doc-engine/draft): a Car-Accident journey can be drafted into a complete demand letter section-by-section, conditioned on org-scoped case context, the case-type playbook, and the firm-style placeholder. Every generated sentence carries traceRefs linking it to the case-context inputs it was conditioned on; drafts persist to GeneratedDocument (content + engineSections + traceRefs) and render in the new web preview with sentence-level provenance.
NewEngine config schema (additive): section_schemas (per-section prompt graph; system rows + firm overrides) and playbooks (HoLaCe-owned case-type theories, citations, damages framework, anchoring guidance), plus the seeded system section graph and Texas Car-Accident playbook for demand letters.
ImprovedBuild/migrations: prisma/migrations/**/*.sql un-ignored in .gitignore — a blanket *.sql rule was silently excluding committed migrations.
FixBilling captured at creation on the new engine drafting path: the demand charge fires when the engine document is persisted, before any content is returned (idempotent with the existing export hooks; a billing failure never blocks document delivery).
ImprovedAdded Sentry error monitoring via @sentry/nextjs (instrumentation.ts + server/edge/client init). Server-side errors (including the PrismaClientKnownRequestError P1001 class that surfaced during the 2026-06-04 DB incident) and client errors now report to the Sentry "holace" project, with an alert rule that emails on new issues — complementing the new uptime monitoring on /api/health. Privacy: sendDefaultPii is false (no request bodies, headers, cookies, or user identifiers are sent — HoLaCe handles privileged legal data) and Session Replay is disabled. Source-map upload is disabled for now because the build runs --turbopack; error capture is unaffected. Active only when NEXT_PUBLIC_SENTRY_DSN is set (production).
v0.18.0.6
June 4, 2026
GH#176 — restore demand-letter "Download Report" / "Download Both" buttons when a journey has multiple investigation requests
FixGH#176 (reported by Brian Hardiman, Law Office of Joseph L Woods): the "Download Report" and "Download Both" buttons disappeared from the demand-letter editor for some matters. Root cause: `app/dashboard/demand-letters/[id]/page.tsx` resolved the linked InvestigationForm by matching only the SINGLE most-recent InvestigationRequest on the journey (`findFirst` + `orderBy createdAt desc`). When a journey accumulates more than one request (e.g. a duplicate/re-request created later with a slightly different address — "15916 Vanowen St Apt 210" vs "15916 Vanowen St"), the completed form stays linked (via `formData.requestId`) to the ORIGINAL request, so both the requestId match and the propertyAddress fallback miss and `investigationForm` resolves to null. The buttons render only when it is truthy (`demand-letter-editor.tsx:610-631`), so they silently vanished — even though the report data was never lost. Fix: keep the existing latest-request lookup as stage 1 (so every demand letter that already resolves a report keeps resolving the IDENTICAL one — important, since surfacing the wrong investigation on a legal document would be worse than a missing button), and only when stage 1 finds nothing, broaden the search across ALL of the journey's requests — an OR over requestIds for the `formData.requestId` JSON-path match, then an OR over each request's propertyAddress + tenantName as a fallback. Verified against production data: stage 1 resolves 33/34 Woods demand letters exactly as before, and the one affected letter (which previously matched no request at all) now resolves via stage 2 to the correct APPROVED report — 34/34, with zero change to the report shown on any already-working letter.
SecurityGH#141: Eliminated plaintext password storage on production. Side-finding from the W2-3 audit surfaced that 20 of 335 User rows held plaintext password values and 0 were bcrypt-hashed. `app/api/auth/login/route.ts:43` was doing a naked `password !== user.password` string compare and `app/api/auth/update-password/route.ts:58` was writing plaintext on every change — the codebase had never integrated bcrypt despite the schema comment "Demo/testing only - NOT SECURE!" on the column. Fixed: (1) added `lib/auth/password.ts` with `hashPassword`/`verifyPassword`/`isBcryptHash` using bcryptjs at cost 10, (2) login + update-password routes now use bcrypt-only verification (refuses non-bcrypt stored values with a SECURITY console.error — magic-link recovery remains available), (3) one-time `scripts/sec-rehash-plaintext-passwords.ts` migrated the 20 plaintext rows to bcrypt in-place via verify-update-verify transactions, preserving each user's actual password so existing logins continue to work, (4) Prisma `$extends` regression guard in `utils/db.ts` rejects any `User.password` write that is not bcrypt-formatted on `create`/`update`/`updateMany`/`upsert`/`createMany`. Null/empty remain allowed for the 315 historically-null rows. Post-hash audit on tramway: 0 plaintext / 20 bcrypt / 315 null.
v0.18.0.4
May 19, 2026
Wave 2 W2-6 — Resend Intake Packet (GH #128)
NewGH #128: Resend Intake Packet — when an incorrect recipient email was entered on the original intake-packet send, staff can now correct the email and re-fire only the documents that have not been signed yet. New "Resend Intake Packet (N)" CTA appears in the E-Sign Timeline tab header whenever the journey has at least one SENT but-not-SIGNED packet document. The modal pre-fills the current journey email (editable), shows exactly which documents will be resent vs. skipped, and on submit (a) updates `journey.email` if the recipient differs, (b) re-issues only the unsigned documents via DocuSeal + the legacy intake-form token flow, (c) records fresh `DocumentEvent{eventType=SENT}` rows per resent doc — which keeps PR #126's DOCS_SENT guard satisfied for any future re-entry — and (d) logs an Activity entry referencing the previous email so the audit trail captures the typo correction. Already-signed documents are never re-sent (idempotency guarantee). New API route `POST /api/avenue/journeys/[id]/resend-intake-packet` with the same auth + error-mapping shape as the sibling `send-intake-packet` endpoint.
v0.18.0.3
May 19, 2026
Wave 2 W2-4 — Settlement math regression suite + legacy chronology pricing disclosure (GH #129)
FixGH #129: Settlement tab math integrity hardened. Dustin reported JRN-000529 displaying a $12,300 Recovery Amount as $33.33 with cascading errors (legal fees $11.11, net to client −$478.23). Investigation on current main + live prod confirmed the bug does NOT reproduce — `r.amount` is bound correctly in every display path (settlement-right-column.tsx Recovery Amounts table, KPI strip, Recovery Summary, Legal Fees), and both math services (`settlement-calculator.service.ts`, `net-to-client.ts`) sum the right field. The bug-row's `updatedAt` was 5 minutes after Dustin filed, indicating he corrected the entry himself after reporting. To prevent a real future regression of this class, the contract is now pinned by 20 tests: 12 unit tests against `calculateSettlement` (zero recovery, single $12,300, multi-recovery with mixed feePercent, GW PERCENT/DOLLAR, 7-figure, `feePercent=null` falls back to contingency, `feePercent=0` honored as pro-bono, regression scenario mirroring Dustin's exact prod state) + 8 structural and rendering tests on the Recovery Amounts row (asserts `<td>{fmt(r.amount)}` is the binding and that no `<td>{fmt(r.feePercent)}` or `<td>{fmt(contingencyPercent)}` regression sneaks in).
ImprovedSettlement tab Expenses section now displays an Info-icon tooltip next to legacy HoLaCe-billed chronology / demand letter rows priced under $100 — explaining that per changelog 0.16.3.4 (2026-04-30) historical billing rows are not retroactively repriced. JRN-000529 has a $0.45 legacy chronology bill (3 pages × $0.15/page) from before the GH#74 flat-$150 fix reached prod; new generations correctly bill flat $150. No data backfill — preserves the invoice trail.
FixServer-side guard now blocks any DOCS_SENT stage transition unless the intake packet has actually been sent (Journey.intakePacketSentAt populated). Closes the force-bypass path identified in the GH#76 audit where /api/avenue/journeys/[id]/transition could advance a Prospect journey straight to DOCS_SENT without the SendIntakePacketModal ever firing — leaving DocuSeal submissions unwritten and the client never receiving the contract+HIPAA+intake bundle. The guard lives in lib/services/stage-transition-service.ts so every transition path (UI, API, autoflow) gets the protection. 6 unit tests cover the allow / deny / edge-case matrix.
Improved"Send Intake Packet" CTA on Prospect journey cards is now a solid-primary button (was a low-contrast outline) in both Kanban and List view. Discoverability complaint from Dustin's original GH#76 report. Same modal, same eligibility helper (canSendIntakePacket) — only the Button variant + className changed. Theme-compliant per /docs/THEME_GUARDRAILS.md.
v0.18.0.1
May 12, 2026
Bug-close script filters by repo URL
FixBug-close script now filters by repo URL to avoid matching legacy webdevtodayjason/holace duplicates — previously, findFirst silently no-op'd on the legacy CLOSED row and never reached the actual OPEN row in Team-Sem/holace-io.
v0.18.0.0
May 12, 2026
Request Tracking Layer — unified API for demands + investigations (Dustin IDS #3)
NewNew `GET /api/dashboard/active-requests` endpoint aggregates `InvestigationRequest` + `DemandLetter` + `DemandNegotiation` into one shape with counts, items, and stale-item alerts. Addresses Dustin Fox's IDS #3 from the 2026-05-11 brief: Habitability supervisors and PI billers now have a single read surface for "every request in flight." Supports filters: `division=HABITABILITY|PI|ALL`, `status=ACTIVE|STALE|COMPLETED|CANCELLED|ALL`, `ownerId`, `olderThanDays`, `staleThresholdDays` (default 14). No schema change. UI is a follow-on slice — `/dashboard/requests` page lands next.
NewNew `lib/services/request-tracking-service.ts` is the underlying aggregator. Org-scoped on every Prisma read (RLS-off discipline per CLAUDE.md): InvestigationRequest passes `where.organizationId`, DemandLetter passes the polymorphic `OR: [{Journey:{organizationId}}, {Investigation:{organizationId}}]`, DemandNegotiation passes `OR: [{case:{organizationId}}, {journey:{organizationId}}]` (covering both legacy case-keyed and Avenue journey-keyed rows). Status normalization collapses three independent status enums into a 3-state shared vocabulary (ACTIVE/COMPLETED/CANCELLED); `statusRaw` retained for consumers that need the original. Division is inferred from `InvestigationRequest.investigationType` and `Journey.caseType` (UNKNOWN is a legitimate value — Journey.journeyType column doesn't exist today).
NewTest suite at `lib/services/__tests__/request-tracking-service.test.ts` pins the normalization vocabulary so any future enum drift fails a test; verifies org-scoping is asserted on every underlying query; covers the STALE filter, division filter, alerts severity (WARN at threshold, CRIT at 2x), and the oldest-ACTIVE-first ordering rule. Uses an injected fake Prisma to keep the test fast and DB-independent.
v0.17.0.18
May 11, 2026
Documentation link in dashboard sidebar
NewDocumentation link added to dashboard sidebar — opens https://docs.holace.io in a new tab for quick access from any dashboard page.
v0.17.0.17
May 11, 2026
Lead-Source admin CRUD UI — Phase 1 spec gap #4
NewFirm admin lead source CRUD UI at /dashboard/settings/lead-sources (Phase 1 spec gap #4). Adds POST/PUT/DELETE routes to /api/lead-sources (with FIRM_ADMIN/SUPER_ADMIN write guard + zod validation) and a new editor page that lets firm admins add new marketing channels, rename existing ones, change sort order, disable (soft-delete via isActive) and re-enable sources. Org-scoped on every read and write (RLS-off discipline). Soft delete keeps historical Journey.leadSource string attribution intact while hiding the option from new-journey dropdowns. Theme-compliant (no hardcoded colors); honors light + dark mode.
v0.17.0.16
May 11, 2026
TX Statute-of-Limitations Auto-Calc — Phase 1 Spec Gap #5
NewTexas statute-of-limitations auto-calculated from date of incident (2-year hardcoded; manual override preserved). Phase 1 spec gap #5. Wired into `JourneyService.createJourney` (auto-fills when caller omits `statuteOfLimitations`) and `JourneyService.updateJourney` (re-derives when `dateOfIncident` changes AND the existing SOL still matches the prior auto-calc value; otherwise leaves the manual value alone). Schema-free implementation via exact-value comparison — no `solAutoSet` column required. Multi-state config is deferred per ORCHESTRATION.md 2026-05-05 decision; Texas-only today.
v0.17.0.15
May 11, 2026
Client Welcome Email After Signing — Phase 1 spec gap #3
NewClient welcome email sent after intake docs fully signed (Phase 1 spec gap #3). Slice G's post-signing fan-out previously only notified internal staff (attorney, paralegal, firm-admin fallback). Per Dustin Fox spec ¶35, the CLIENT now also receives a friendly "you are now represented by <firm>" email referencing the firm name and (when assigned) the attorney's name. Reuses the existing Resend infra (`lib/email/service.ts`) with `emailType=WELCOME` so the existing EmailLog audit trail catches every send.
NewIdempotent + safe: the welcome path checks `EmailLog` for a prior SENT row (journeyId + recipient + emailType=WELCOME) before sending, so DocuSeal webhook retries can't double-email the client. Missing `journey.email` skips with a warning (no throw); send failures are best-effort and never undo the upstream auto-advance commit. PII discipline preserved — only `[orgId, journeyId]` go to logs, never client name or email. Org-scoped at the journey lookup AND the attorney lookup as defense-in-depth (RLS is OFF — see CLAUDE.md).
NewNew template `lib/email/templates/client-welcome-after-signing.ts` with full HTML escaping for firm + client + attorney names. Test suite extended with 7 new cases: client-welcome happy path, missing email, idempotent skip on prior SENT EmailLog row, send-failure resilience, attorney-less fallback phrasing, template HTML-escaping, null-name graceful fallback, plus 2 direct-call tests for `sendClientWelcomeAfterSigning`.
v0.17.0.14
May 6, 2026
Unassigned-Attorney Action Item Flag — Phase 1 Slice M
NewSlice M: every Avenue journey sitting in Liability Pending without an attorney now surfaces a destructive-themed "⚠Unassigned" badge in BOTH the Kanban journey card and the Avenue list-view "Assigned To" column, honoring the List View / Kanban parity hard merge gate (`ops/rules/list-view-parity.md`). The badge tooltip reads "No attorney assigned — assign one to start the intake-call task" so the next action is obvious from either view. Closes audit gap #2 in `ops/audits/2026-05-06-phase-1-spec-gap.md` and Dustin Fox spec ¶61 ("The system should flag any case in Liability Pending that still has no attorney assigned as an outstanding action item.").
NewSlice M: new dashboard "Action Required" tile (`UnassignedLiabilityPendingWidget`) renders an org-wide count of cases needing assignment ("X cases need attorney assignment") and deep-links to `/dashboard/avenue/journeys?view=list&filter=unassigned-liability-pending`. The tile is silent (renders nothing) when the count is 0 so a clean dashboard stays clean. Polls every 60s via SWR.
NewSlice M: Avenue list view gains a quick-filter chip ("âš Unassigned (Liability Pending)") with a live count badge. Toggling the chip narrows the table to the action-item set; the chip is also auto-activated when the page is opened with `?filter=unassigned-liability-pending`, so the dashboard widget click lands directly on the filtered list. The journey-pipeline-counts widget on the dashboard remains the primary stage-distribution surface; this filter is action-oriented and complementary.
NewSlice M: new API `GET /api/dashboard/unassigned-liability-pending` returns `{ count, journeys: [{ id, journeyNumber, firstName, lastName, currentStageCode, daysSinceStageEntry }] }`. Org-scoped via the session's `organizationId` (defense-in-depth against the known-disabled-RLS posture). `daysSinceStageEntry` is derived from the most recent `StageTransitionHistory` row whose `toStage.code = LIABILITY_PENDING` (the SYSTEM-attributed transition Slice D writes on full-signing), with `Journey.updatedAt` as the fallback for legacy / imported journeys.
NewSlice M: 9-test suite — `__tests__/api/unassigned-liability-pending.test.ts` covers 401-on-no-session, the 200 happy path with the canonical filter signature, the empty-result case, and explicit cross-tenant org-scoping; `__tests__/components/unassigned-attorney-badge.test.tsx` covers the `isUnassignedLiabilityPending()` predicate (positive, negative on-assignee, negative on-other-stage, null-safe inputs) and the badge's tooltip + ARIA label contract.
FixH1 (assignment-service): round-robin cursor advance is now atomic. The ROUND_ROBIN persist path takes a `SELECT ... FOR UPDATE` row lock on the AssignmentRule via raw SQL inside the existing transaction, then re-reads `roundRobinPool` from the locked snapshot before computing `nextIndex`. Concurrent post-signing webhooks for the same firm now serialize on the row lock instead of both computing `next` from the same stale cursor — they previously could double-assign the same attorney and skip the next slot. Preview path (`persist: false`), MANUAL, and TIERED_BY_CASE_TYPE skip the lock so a dashboard preview never blocks a live assignment.
SecurityH2 (auto-advancement-service): post-signing fan-out hook failures (`createIntroCallTask`, `notifyOnSigningComplete`) no longer disappear into a `console.warn`. The dynamic-import wrapper distinguishes module-not-found (warn + skip; legacy guard) from real runtime errors (log at error level + persist an `Activity` audit row keyed to the journey with module/function/errorName/errorMessage in metadata). Dropped intro-call tasks and missing post-signing notifications are now visible in the journey activity feed and queryable for daily review or future drift-detection alerting. The auto-advance commit still proceeds — hook failures are post-commit and stay best-effort.
FixCorrected the misleading "SELECT ... FOR UPDATE" comments in `assignment-service.ts` and the post-signing orchestrator in `auto-advancement-service.ts` to match the new implementation. The previous comments promised atomicity that the code did not provide (audit finding L1).
v0.17.0.12
May 6, 2026
Schema FK hardening — Phase 1.1
FixSlice N: added foreign-key constraints flagged by the Phase 1 db-integrity audit (`ops/audits/2026-05-06-phase-1-db-integrity.md`, findings H-1 + H-2). `SmsLog.organizationId` -> `Organization.id` ON DELETE CASCADE, `SmsLog.journeyId` -> `Journey.id` ON DELETE SET NULL, and `AssignmentRule.fallbackUserId` -> `User.id` ON DELETE SET NULL (named relation `AssignmentRuleFallback`). All three columns previously shipped as bare strings with no referential integrity; SmsLog is currently empty and AssignmentRule.fallbackUserId has zero orphans, so the migration applies risk-free. Migration SQL is idempotent (wrapped in `DO $$ ... EXCEPTION WHEN duplicate_object ... END $$`).
v0.17.0.11
May 6, 2026
Lawmatics CSV Importer — Phase 1 Slice K
NewSlice K: one-shot CLI importer (`scripts/import-lawmatics.ts`) brings DFox Law's Lawmatics export into HoLaCe **strictly additively** — never overwrites or deletes existing records. Three modes: `--dry-run` (default; classify but write nothing), `--commit` (add new records only; skip on `lawmaticsId` or `email+phone` match), and `--merge` (commit + fill NULL columns on existing records, never overwriting non-null fields). Every Prisma query is org-scoped; the script REFUSES to run without `--organization-id`. Streaming CSV parser keeps memory bounded for the ~1,500-row Matter export.
NewSlice K: new `LawmaticsImportRun` + `LawmaticsImportRow` Prisma models give the importer a dedicated audit trail, keeping ~7,500 per-run audit rows out of the Activity feed. Per-row entries record action (ADDED/SKIPPED/MERGED/ERRORED), reason, and column NAMES written — never CSV values. Console output never echoes a CSV value either; PII discipline is enforced by the `safeLog()` wrapper and verified by tests.
NewSlice K: stage mapper translates Lawmatics free-text `stage_name` / `status` / `sub_status` (with `contract_signed` tie-breaker) into the 11-stage Prospect pipeline + Prelitigation/LIABILITY_PENDING. "Hired" + signed contract → Prelitigation/LIABILITY_PENDING with HIRED tag (matches Slice A's data migration). "Hired" + unsigned → Prospect/DOCS_SENT with HIRED tag. "Signed Up"/"Client"/"Active Client" → LIABILITY_PENDING with HIRED tag. Unmapped stages fall back to NEW_LEAD with the original value preserved as a `LAWMATICS_UNMAPPED_STAGE: <orig>` tag for human review post-import.
NewSlice K: header alias system tolerates Lawmatics CSV variations (`First Name` / `first_name` / `FIRST-NAME` / `email` / `email_address` / `e_mail` etc.) without us peeking at the real PII export. Unrecognized headers are surfaced in the dry-run summary (column names only) so Adrianna can flag them. Lead-source auto-create populates `OrganizationLeadSource` for sources Lawmatics references that aren't yet in HoLaCe — each auto-create writes its own audit row.
NewSlice K: 45-test suite (`__tests__/scripts/import-lawmatics.test.ts`) covers stage mapping (every Lawmatics value variant + every truthy/falsy contract_signed value), header aliasing, additive-merge semantics, dry-run/commit/merge mode behavior, error rows for missing `lawmaticsId`, PII-safety in the audit log, org-scoping (cross-tenant lawmaticsId is NOT a duplicate), and lead-source auto-create. Tests use synthetic CSV fixtures only — the real DFox export is never read.
NewSlice K: runbook docs (`scripts/import-lawmatics.md`) for Adrianna + Erica covering Lawmatics export instructions, dry-run-first workflow, audit-log SQL queries, and a stage-mapping reference table.
v0.17.0.10
May 6, 2026
Post-Signing Notification Fan-Out — Phase 1 Slice G
NewSlice G: when Slice D auto-advances a Journey to Prelitigation / Liability Pending after all 3 intake documents (Contract, HIPAA, Intake Form) sign, the new post-signing-notifications service fans out a "New signed client: {firstName} {lastName}" notification to the assigned attorney, the assigned paralegal, and the firm-admin fallback. Each non-null user from Slice E's assignment resolution gets both a Resend email and an in-app Notification row that surfaces in the bell-icon dropdown — the same notification is visible whether the user is on the List view or Kanban view (parity is satisfied at the surfacing layer, not duplicated).
NewnotifyOnSigningComplete({ journeyId, organizationId, attorneyId, paralegalId, fallbackUserId }) is the public entry point invoked by Slice D via dynamic import. It dedupes recipients across slots (e.g. solo attorney is also the firm admin → one notification, not two), org-scopes both the Journey lookup and every user lookup as defense-in-depth (a poisoned attorneyId from a different tenant is silently rejected), and short-circuits to a no-op + console warning when all 3 user IDs are null. Email failures never block the in-app notification record.
NewIdempotent: every (journeyId × userId) pair gets a deterministic Notification.id ("notif_post_signing_{journeyId}_{userId}") so duplicate fan-outs (e.g. webhook retries from Slice D) are absorbed with at most one extra DB round-trip and zero extra emails. Notification rows store kind=POST_SIGNING_COMPLETE in the JSON data field for future digest / reporting queries, and the email body deep-links into /dashboard/avenue/journeys/{id} with a brand-consistent CTA matching the Phase 1 email surface area.
v0.17.0.8
May 6, 2026
Auto-Advance on Full Signing — Phase 1 Slice D
NewSlice D: when all 3 intake documents (Contract, HIPAA, Intake Form) record a SIGNED DocumentEvent for a journey, the system automatically advances the journey from any Prospect stage directly to PRELITIGATION / Liability Pending — no manual drag, no intermediate "Hired" stage. Triggered by the DocuSeal webhook.
NewSlice D: partial signing (1 or 2 of 3 docs) automatically moves the journey to the new Prospect "Partially Signed" stage so firm staff can see at a glance which clients are mid-flow. Idempotent — duplicate webhook deliveries do not double-advance.
NewSlice D: full signing fires the firm's active AssignmentRule (Slice E) to resolve attorney + paralegal, persists them onto the Journey in the same transaction as the stage move, appends the "HIRED" reporting tag, and writes a SYSTEM-attributed StageTransitionHistory row.
NewSlice D: post-signing fan-out hooks for Slice F (intro-call task) and Slice G (notifications) are invoked via dynamic import — auto-advance never blocks if either parallel slice is absent.
NewNew service exports: countSignedIntakeDocs(journeyId, organizationId) and onDocumentSigned({ journeyId, organizationId }) in lib/services/auto-advancement-service.ts. DocuSeal webhook (app/api/webhooks/docuseal/route.ts) calls onDocumentSigned after every SIGNED event; failures are logged but never block the 200 response.
v0.17.0.7
May 6, 2026
Intake Form → Journey Auto-Populate (Slice J of Lawmatics → HoLaCe replacement P1)
NewSlice J: when a client submits the public intake form (POST /api/intake/[token]/submit), client answers now auto-populate the matching Journey columns (DOB, address, phone, accident details, vehicle, defendant, injuries, employment, etc.). Staff no longer have to re-key the same data they already saw on the printed intake — they pull up the journey and the typed columns are filled in.
NewNew lib/services/intake-form-mapper.ts implements ADDITIVE-MERGE semantics (mirror of the Slice K Lawmatics importer): only NULL / empty Journey columns get populated; non-null Journey columns are NEVER overwritten by client-provided data so staff edits + initial-creation values always win. Booleans are written when the column is null, including the value `false`. String arrays are filled only when the existing array is null or empty. Whitespace-only form values count as missing.
NewType coercion in the mapper: dates ("1985-03-14" or "MM/DD/YYYY") → Date; currency ("$2,500.00") → Float; numerics → Float/Int; unparseable values are skipped instead of writing NaN. Field-by-field NULL safety means a missing or invalid form value is a no-op rather than an error.
SecurityPII discipline: the route audit-log entry records which Journey COLUMN NAMES were auto-populated (e.g. "dateOfBirth", "street") never the values themselves. DOB / address / employer / DL / SSN values only land in their typed Journey column. The Activity row stores populatedFields as names + a count, plus the source tag "intake-form-autopopulate". The Journey update enforces org scoping via where: { id, organizationId } as defense-in-depth since RLS is OFF (per CLAUDE.md).
v0.17.0.6
May 6, 2026
Attorney Intro-Call Task — Phase 1 Slice F
NewSlice F: when Slice D auto-assigns an attorney to a Journey after full document signing, the new intro-call-task-service automatically creates an "Introduce yourself to {client name} (intro call)" Task on that attorney with a 48-hour due date, priority high, and a markdown body containing the client phone, email, and a deep-link to the Journey detail page. The task is the standard PI relationship step Dustin Fox called out — within two business days of being routed a new client, the attorney owes them an introductory call.
NewcreateIntroCallTask({ journeyId, organizationId, attorneyId, fallbackUserId }) routes to attorneyId, falls back to fallbackUserId if the assignment-rule resolved no attorney, and skips silently with reason: "no assignee" if both are null. The task is org-scoped (RLS-off discipline), and the Journey is verified to belong to the supplied organizationId before any row is written. Idempotent: a second call for the same Journey returns the existing open task instead of creating a duplicate (only "completed" intro-call tasks let a new one be created).
v0.17.0.5
May 5, 2026
Send Intake Packet Action — Phase 1 Slice B
NewNew "Send Intake Packet" button on journey card (Kanban), list row, and detail page
NewConfirmation modal with editable recipient email + optional attorney/paralegal fields
NewStage-drag to Documents Sent triggers the same intake-packet flow
NewService: sendIntakePacket() fans contract + HIPAA + intake form via DocuSeal, advances stage to DOCS_SENT, records DocumentEvent SENT for all 3 docs
NewAPI: POST /api/avenue/journeys/[id]/send-intake-packet with typed error codes (400/404/409/500/503)
v0.17.0.4
May 5, 2026
Assignment Rules — Firm-Configurable Attorney/Paralegal Routing (Slice E of Lawmatics → HoLaCe replacement P1)
NewSlice E: firms can now configure how attorneys and paralegals are assigned to a Journey AFTER full document signing fires (Wave 3 / slice D will read the rule). Three routing strategies are supported: ROUND_ROBIN (rotate through configured attorney + paralegal pools), MANUAL (no auto-assignment, staff picks at signing), and TIERED_BY_CASE_TYPE (route by Journey.caseType — e.g. car accidents to Attorney A, dog bites to Attorney B). Every rule has a fallback user (typically the firm admin) to handle empty pools and unconfigured case types.
NewNew per-organization AssignmentRule model + AssignmentKind enum. A partial unique index (organizationId WHERE isActive=true) enforces "only one active rule per firm" while still allowing inactive drafts. The migration backfills every existing organization with a default MANUAL active rule whose fallback is the first FIRM_ADMIN of that org, and the same default is seeded into every newly-created firm via the auth/verify, admin/firms/create, and complete-onboarding paths so brand-new firms always have exactly one active rule from day zero.
NewNew assignment-service.getNextAssignment({ organizationId, journey }) is the function slice D will call when full signing fires. ROUND_ROBIN advances and persists its rotation cursor in a transaction so concurrent webhooks can't both pick index 0; preview callers can pass persist:false for a no-write peek. New API endpoints GET/PUT /api/firm-settings/assignment-rule and GET /api/firm-settings/assignment-rule/preview power the new admin UI at /dashboard/settings/assignment-rules where firm admins pick the routing strategy, configure attorney/paralegal pools or per-case-type tiers, choose a fallback user, and preview who would be assigned right now without saving.
SecurityDefense-in-depth: PUT /api/firm-settings/assignment-rule rejects any rule that references user IDs not in the caller's organization (catches a firm admin sneaking in another tenant's user IDs through a crafted body), requires FIRM_ADMIN role for writes, and refuses to persist a ROUND_ROBIN rule with no pool and no fallback (would silently fail every assignment). All queries scope by organizationId per the RLS-off discipline in CLAUDE.md.
v0.17.0.3
May 5, 2026
Prospect Pipeline — 11-Stage Restructure + Lawmatics Anchor Fields (Slice A of Lawmatics → HoLaCe replacement P1)
NewSlice A: replaces the legacy 5-stage Prospect pipeline (New Lead, Contacted, Documents Sent, Hired, Referred Out) with the 11-stage pipeline Dustin Fox locked in on 2026-05-05: New Lead → Contacted → Qualifying → Consult Scheduled → Undecided / Pending Review → DNQ → NSQ → Documents Sent → Partially Signed → Referred Out → Lost / NFA. "Hired" is retired as a visible Prospect stage; conversion is now expressed as a HIRED tag on the journey plus a cross-avenue transition to Prelitigation / Liability Pending. NSQ is intentionally both a stage (active workflow) AND a tag (re-conversion reporting) per the meeting decision. Canonical codes/order/display-names live in lib/constants/prospect-stages.ts.
NewNew schema anchors required by the rest of Phase 1 and the Phase 3 long-term-nurture engine: Journey.lawmaticsId (text, unique) and Contact.lawmaticsId (text, unique) give the Slice K Lawmatics importer a trivial idempotency key; Journey.clientRetentionLocked and Contact.clientRetentionLocked (booleans, default false) reserve the semantic anchor for Phase 3. No reader yet — these are the anchor fields only. NSQ_TAG and HIRED_TAG are reserved values on the existing String[] tags column on both models (no new tag table needed).
ImprovedLive data migration: existing journeys still sitting on the legacy "Hired" Prospect stage are routed to Prelitigation / Liability Pending if contractSigned = true, otherwise to the new Prospect / Documents Sent stage. Both paths get the HIRED tag appended so conversion-reporting queries continue to find them. The legacy Hired stage row is deactivated and renamed (not deleted) so StageTransitionHistory foreign keys remain intact for the audit trail. Migration is idempotent — runs cleanly on fresh dev DBs and on the live production DB.
Improvedstage-transition-service registers PARTIALLY_SIGNED → Prelitigation / Liability Pending as a manual transition fallback (Slice D will fire it automatically when all DocuSeal documents sign). The CSV import path repoints HIRED CSV values to Prelitigation / Liability Pending and adds the new UNDECIDED / NSQ / LOST_NFA Prospect-stage targets.
v0.17.0.2
May 5, 2026
SMS — Twilio Outbound SMS Service (Slice H of Lawmatics → HoLaCe replacement P1)
NewNew reusable outbound-SMS service powered by Twilio and the existing BullMQ worker pipeline. Internal callers invoke sendSms({ organizationId, journeyId?, to, body, kind }) and get back a job id and an SmsLog row id; the worker calls Twilio asynchronously, persists the message SID and delivery state, and surfaces failures with retry semantics that match the rest of the worker service (3 attempts with exponential backoff for transient errors; UnrecoverableError on permanent Twilio codes like invalid number, unsubscribed, region-blocked, etc.). Recipient phone numbers are normalized to E.164 (US 10-digit numbers auto-prefixed with +1).
NewNew SmsLog model + SmsStatus / SmsKind enums give every outbound SMS a forensic record (recipient, body, kind, twilioSid, status, error code/message, sent/delivered timestamps). First consumer is the intake-packet reminder Dustin Fox spec'd, but the kinds enum (INTAKE_REMINDER | INTAKE_PACKET_SENT | CUSTOM) is extensible for future flows.
NewNew /api/webhooks/twilio/status endpoint receives Twilio delivery status callbacks (delivered, undelivered, failed) and updates the SmsLog row keyed by Twilio Message SID. The endpoint validates the X-Twilio-Signature header against TWILIO_AUTH_TOKEN to reject spoofed callbacks; in production a missing token also fails closed.
ImprovedRequired env vars (TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM_NUMBER, TWILIO_STATUS_WEBHOOK_URL) are documented in .env.example and lib/services/sms.service.md with a clear note that they must be configured on the Railway PRODUCTION and Workers services before deploy. Without TWILIO_FROM_NUMBER the worker fails fast with errorCode="CONFIG_MISSING" instead of silently retrying forever.
v0.17.0.1
May 5, 2026
DocuSeal — Per-Document Event Timeline
NewSlice C: every retainer / HIPAA / intake-form e-signature step (Sent → Viewed → Signed → Declined → Expired) is now captured as a DocumentEvent row and rendered on a new "E-Sign Timeline" tab on the journey detail page. Each event shows actor (staff for SENT, client email for VIEWED/SIGNED), relative timestamp ("2 hours ago") and absolute timestamp on hover, grouped by document type with an "In flight / Signed / Stalled" rollup badge.
NewQuick-glance "X/3 signed" status badge added to BOTH the Avenue kanban journey card and the journey list-view row (and to the journey detail page header), so attorneys can see across all journeys which clients still owe a signature without drilling in. Honours the LIST VIEW PARITY rule.
SecurityDocuSeal webhook handler now supports HMAC signature verification via X-DocuSeal-Signature header (DOCUSEAL_WEBHOOK_HMAC_SECRET) in addition to the legacy static-secret scheme. Production deployments must configure at least one. The handler also derives organizationId strictly from the trusted Journey row — webhook payloads can no longer steer events to a different tenant.
ImprovedWebhook delivery is idempotent: a unique constraint on DocumentEvent(docuSealSubmissionId, eventType) means duplicate retries from DocuSeal silently drop instead of double-recording on the timeline.
v0.17.0.0
May 5, 2026
Lead Source — Required at Journey Creation for Marketing Attribution
NewSlice I (Lawmatics → HoLaCe replacement P1): Lead Source is now a required field on every new journey. Both the full-page Create Journey form and the "+ New Journey" modal (reachable from List, Kanban, and Calendar views) gate submit until a Lead Source is selected, and the POST /api/avenue/journeys endpoint returns a 400 with a descriptive error if leadSource is missing or whitespace-only. This drives Dustin's marketing ROI dashboard — every prospect now has a tracked attribution channel (BNI, Google Ads, Facebook, Phone, Referral, Walk-In, etc.) at intake.
NewNew per-organization OrganizationLeadSource model lets each firm customize its own list of lead-source channels instead of being constrained to a hardcoded enum. The migration seeds ten default options (Phone, Website, Google Ads, Facebook, BNI, Referral, Walk-In, Yelp, NextDoor, Other) for every existing organization idempotently, and the same defaults are seeded into every newly-created firm via the auth/verify, admin/firms/create, and complete-onboarding paths so brand-new firms see a populated dropdown immediately. New API endpoints — GET/POST /api/lead-sources — power the dropdown and allow ad-hoc additions; full CRUD admin UI for managing the list is queued as a follow-up slice.
ImprovedCSV import, Clio import, and intake-automation paths remain null-tolerant for back-compat — the leadSource gate applies only to manual UI creation. Existing journeys with null leadSource are unaffected; only new manual creations are required to attribute.
NewGH #81: The journey case dashboard now shows the current stage's checklist directly inside the Tasks panel (renamed "Tasks & Steps"). Each step has a checkbox so users can mark steps complete or incomplete from the dashboard, completed steps are visually distinguished with strikethrough plus the user and date who completed them, and required steps are flagged with a red asterisk. This closes the visibility gap Dustin reported where the Prelit kanban card showed "X of Y steps" progress but there was no way to see what those steps were, which were done, or what remained without leaving the dashboard. Tasks (open user work) and stage steps (the standard checklist behind that progress count) are now in one unified panel separated by clearly-labeled sub-headers.
ImprovedGH #81: Journey detail API now includes the current stage's custom step completions alongside default ones, so any custom steps a firm has added to a stage participate in the same dashboard checklist with proper completion attribution.
v0.16.3.10
May 4, 2026
Settlement — Generate Disbursement Button No Longer Silent
FixGH #82: "Generate Disbursement Statement" button on the Settlement tab no longer appears broken when pre-flight checks block generation. Previously the button was HTML-disabled whenever any pre-flight check returned `block` AND the click handler had a silent early-return for the same condition, so a click produced no spinner, no toast, no modal, and no error — making the button look completely dead from the user's perspective (Dustin reported on the Michael Torres demo persona, JRN-000524 Kenyon Purdy, where Recovery, Legal Fees, Expenses, and 7 medical liens were all populated but the button still did nothing). The button is now only disabled while a generation is already in flight; clicking it while a pre-flight block is active fires a sonner toast that names the specific blocking checks and points the user at the Pre-Flight Checklist below the button. Sales-flow / disbursement-flow impact: attorneys and demo viewers now get an actionable explanation instead of a dead button on the path to generating the final settlement statement.
v0.16.3.9
May 3, 2026
Branding — Logo Preview Renders + In-App Guidance
FixGH #75: Brand-asset preview thumbnail in Settings > Branding > Media Assets no longer renders as a blank dark box. Uploaded logos are written to process.cwd()/uploads/ which Next.js does not static-serve, so the previous <img src="/uploads/..."> request 404'd. The gallery now fetches the file through a new auth-checked API route at /api/organization/brand-assets/media/[id]/file that streams the binary with the correct content-type. Existing uploaded assets render without re-upload.
FixGH #75: Preview tile background switched from bg-muted to bg-card with a subtle border so logos designed for a dark background (e.g., the "logo-fox-law-dark-background" report case) remain visible. Previously a white-on-transparent logo on a dark muted tile read as completely blank. Also fixed a latent bug in the image error handler that injected a JSX tag as innerHTML, which the browser silently dropped.
ImprovedGH #75: Brand Assets panel now includes an in-app explainer telling users where their uploaded logo will appear (firm letterhead on generated demand letters and other client-facing documents) and noting that display integration across remaining surfaces — settlement statements, email templates — is being finalized. Shown in both empty-state and populated-state.
v0.16.3.8
May 3, 2026
Medical Chronology — MRI Findings Captured Reliably
FixGH #65: Medical Chronology now reliably captures the radiology findings that drive case value — disc extrusion, disc herniation, nerve root impingement, spinal/foraminal stenosis, annular tear — instead of dropping them on the floor. Two upstream gaps were fixed: (1) the AI extraction prompt now has a dedicated Radiology / Imaging section that requires the radiologist's Findings + Impression to be preserved near-verbatim with anatomic level (e.g., L4-L5) and sidedness (left/right/bilateral) intact, and (2) imaging entries are no longer truncated to 500 characters when fed into the Diagnostic Tests / Medical Chronology / Executive Summary generators — they get a 2,500-character budget so the actual radiology prose survives downstream. A CPT-range + title-pattern fallback also catches imaging entries the extractor mis-categorizes. Affects newly processed chronologies; previously processed entries retain whatever extract text was already saved.
v0.16.3.7
May 3, 2026
Medical Chronology — Medications Tab Extraction Fix
FixGH #63: Medications tab on the Medical Chronology view now populates after running the extraction pipeline. The AI extraction system prompt was not telling the model to extract medications aggressively — only the `entries` array carried an "Extract ALL" directive, and there was no guidance about WHERE in a chart to look (encounter notes, discharge instructions, MAR / prescription orders, "Active Medications" panels). gpt-4o-mini was happily returning an empty `medications: []` even on records that visibly contained Norco, ibuprofen, and cyclobenzaprine prescriptions. Strengthened the prompt with a parallel "Extract ALL medications" rule that names the chart sections to scan, treats inline references inside encounter notes as first-class extractions, and replaces the literal "Medication name" placeholder example with concrete drug-name examples. Also tightened the validator to drop blank-name rows so the tab only shows real medications.
v0.16.3.6
May 3, 2026
Demand Letters — Current Demand reads canonical journey.demandAmount
FixGH #61: Demand Letters tab "Current Demand" card no longer falls back to the legacy `demandNegotiation.amountDemanded` column. It now reads only `journey.demandAmount` — the same single source of truth used by the Dashboard Negotiations panel (GH #43), the Demand tab, the Settlement tab Negotiation Log, and the demand-letter renderer. Removes the divergence Dustin saw where the Demand Letters tab could disagree with the rest of the journey on the same demand value.
v0.16.3.5
May 3, 2026
Demand Letter — Template Resolution Fix for PI / Demo Firms
FixGH #60: Creating a demand letter from a personal-injury journey (Michael Torres / Medical Chronology demo) no longer throws "Template WOODS_CA_DFS not found". Three layered causes: (1) the create-demand-letter UI hardcoded caseType: 'HOUSING' on every POST, forcing the housing template path even for PI cases; (2) detectCaseType() defaulted to HOUSING whenever a journey had any street/incidentLocation, so PI journeys with an accident address but no investigation were misrouted; (3) when the resolved template code (WOODS_CA_DFS, AUTO_ACCIDENT_DEMAND, GENERAL_PI_DEMAND, etc.) was missing for the firm, the service hard-threw instead of falling back. Fix removes the hardcoded HOUSING from both POST sites in app/dashboard/demand-letters/create/page.tsx, treats journeys with medicalRecords as PI in detectCaseType, and adds a getDefaultTemplate fallback in DemandLetterService.createFromJourney/createFromInvestigation so a firm with any default template (e.g. WOODS_CA_DFS) can always generate a letter.
v0.16.3.4
April 30, 2026
Settlement Tab — Flat-Rate Billing for Chronology + Demand Letter
FixGH #74: Medical Chronology and Demand Letter line items on the Settlement tab now bill a flat $150 per generation regardless of page count. Previously the billing engine fell back to a $0.15/page rate when the AdminSetting flat-rate override was missing — so a 4-page chronology was billing $0.60 (e.g. JRN-000524 / Mittie Koss) instead of $150. The per-page fallback has been removed entirely; flat $150 is now hardcoded as the default with super-admin override still available via AdminSetting (holace_chronology_rate / holace_demand_letter_rate). Per-page math remains exclusively in the litigation document path, where it is intentional ($0.05/page overage above the 500-page threshold per FirmPricingConfig).
FixGH #74: Settlement tab line-item descriptions now read "Medical Chronology — flat rate $150.00" / "Demand Letter — flat rate $150.00" instead of the misleading "X pages @ $0.15/page" verbiage. Existing billing records created before this fix are NOT retroactively repriced — they keep their incorrect amounts to preserve the invoice trail. Only newly generated chronologies and demand letters use the corrected pricing.
v0.16.3.3
April 30, 2026
Change Stage Modal — Litigation Available for SOL Emergencies
FixGH #73: The Change Stage modal now exposes Litigation "Pre-Suit Preparation" as a destination from any stage, so an attorney responding to an urgent statute-of-limitations alert can move the journey straight into Litigation and file suit. Previously the modal only showed the current workflow's stages plus DNQ, so the only paths into Litigation were from "Demand Sent" or "Negotiations" — leaving a journey at, e.g., "Liability Pending" with no way to act on a 1-day SOL warning. PRE_SUIT_PREPARATION still flags its required fields with a Warning badge and routes through Force Advance, which is the intended SOL-emergency UX.
v0.16.3.2
April 30, 2026
Journey Pipeline — Per-Avenue Counts Match Dashboard Widget
FixGH #72: The Journey Pipeline kanban (and the list/calendar views under Journeys) now show every active journey in the org, so per-avenue counts match the dashboard's Journey Distribution widget. Previously the dashboard reported (e.g.) 16 Prospect / 105 Prelitigation / 4 Litigation while the kanban only showed 3 Prospect / 94 Prelitigation / 3 Litigation — a silent 25-case shortfall. Root cause: /api/avenue/journeys clamped the requested limit at 100 (Math.min); the kanban's 100, the list view's 500, and the calendar view's 500 were all collapsed to the same 100 ceiling, dropping the oldest 25+ journeys (mostly long-stuck Prospects) from every view. Cap raised to 1000 and kanban now requests 1000 explicitly. Dashboard counts were correct all along — they used unbounded db.journey.count(); the kanban was the one underreporting.
v0.16.3.1
April 30, 2026
Dashboard — Fix 404 on "View All Tasks"
FixGH #71: The "View All Tasks" button at the bottom of the Upcoming Tasks widget on /dashboard no longer returns 404. Added the missing /dashboard/tasks page (organization-scoped task list with status, priority, and search filters) and a backing GET /api/tasks endpoint.
v0.16.3.0
April 28, 2026
Medical Bills — Separate Billed vs Incurred + Currency Formatting
FixGH #56: AI extraction from medical chronology PDFs no longer copies the gross "Total Charges" into both the Billed and Incurred columns. The extractor now also pulls "Current Balance" / "Patient Responsibility" / "Amount Due" and stores it as Incurred — so a Coastal Anesthesia bill showing $4,250 charges with a $500 patient balance correctly populates Billed=$4,250, Incurred=$500 (instead of $4,250 in both).
FixGH #56: Damages tab now exposes Incurred as its own editable cell. When the AI populates incurred incorrectly, the attorney can correct just that cell — the Billed column stays untouched, and adjustment is back-derived to keep the schema invariant.
FixGH #56: The bulk-create damages route used by the Medical Chronology "Yes, Update Damages" modal now accepts an optional incurredAmount per provider so the same separate billed/incurred values are stored — closes the second AI persistence path that was producing the same wrong rows.
ImprovedGH #56: Medical bill numeric inputs (Bill Amount, Adjustment, Incurred, Reduction) now show a "$" prefix so the editable cells visually match the read-only $X,XXX.00 columns. Add Bill modal also gained an optional Incurred field for manual entry.
v0.16.2.3
April 28, 2026
Medical Chronology — Timeline Renders Clinical Info
FixGH #64: Medical Chronology timeline now renders diagnoses, treatment notes, and procedures alongside the visit date and provider. Previously every clinical column showed a blank dash because the chronology renderer was reading column keys (event, description, test) that the AI pipeline never produces — the schema emits findings/treatment for each chronology entry and testName for each diagnostic test. Renderer column keys were resynced with the schema in both the editor HTML export (sectionsToHtml) and the read-only document viewer (TimelineSection, DiagnosticTestsSection).
v0.16.2.2
April 27, 2026
Medical Chronology — Download + Auto-Save Persistence Fix
FixGH #62: Medical Chronology auto-save now persists rich-text edits across page reloads. Previously the chronology page sent { editedHtml } on every editor change, but the PATCH route only whitelisted three other fields and silently dropped the payload — every reload re-derived the editor content from the AI sections and threw away the staff edits. Added a dedicated editedHtml column on MedicalChronology, accepted it in PATCH, and made the editor sync effect prefer it over re-deriving from sections.
NewGH #62: New "Download" button in the Medical Chronology page header exports the chronology as a self-contained .html file (Word opens it natively with formatting preserved). Filename is chronology-<journey-name>-<date>.html. Replaces the prior workaround of hand-copying the chronology into Word, which lost formatting and burned staff time on every case.
ImprovedGH #62: Clicking Generate now clears the prior editedHtml so the freshly generated content takes over (instead of the editor restoring stale edits on top of new sections). Version snapshots also capture editedHtml — a follow-up will wire restore to send it back through PATCH.
v0.16.2.1
April 26, 2026
Medical Chronology — Persistence + Accident Summary Render Fixes
FixGH #57: Medical Chronology now persists across navigation. Returning to the page no longer requires regenerating the chronology — saved entries, vitals, medications, and uploaded records are all restored. Previously the workspace tabs appeared empty on revisit even though the data was saved, which led users to click "Generate" again and burn AI credits re-running the 11-step pipeline.
FixGH #57: Accident Summary now renders as a readable parameter/details table. Previously it displayed as "[object Object],[object Object]..." because the structured rows array produced by the AI pipeline was being stringified as a flat object.
v0.16.2.0
April 26, 2026
Litigation Tab — Phase C UI Shell
NewNew Litigation tab between Investigations and Demand on every journey. The tab reveals court-ordered deadlines tracked exactly as written (no jurisdiction translation), an active-stage banner with progress pills, and placeholder slots for the document workflow that lands in Phase D.
NewCase Scheduling Order card with two states: empty (upload prompt + manual-add) and loaded (Today-marker timeline split into Completed · Upcoming 90 Days · Trial Prep, plus a Next Deadline countdown).
NewDrag-and-drop scheduling-order PDF upload → AI extraction (stubbed) → mandatory attorney review modal → confirm-and-save to CaseDeadline. Nothing is persisted until the attorney clicks Confirm — review is the idempotency gate.
NewInline pencil edit on every deadline card writes a partial PATCH; manual + Add Deadline form posts a new CaseDeadline directly. Optimistic UI keeps the timeline in sync without a refetch.
NewCost Estimate modal reads the firm-level FirmPricingConfig (not hardcoded). Same payload powers every Generate button when Phase D ships.
v0.16.1.0
April 25, 2026
Dashboard Negotiations Panel — Single Source of Truth + Correct Edit Path
FixGH #43: The Edit button on the Dashboard Negotiations panel now takes you to the Settlement tab where you can edit or void any negotiation entry. Previously it incorrectly opened the Edit Journey drawer (client info), which had no relationship to negotiation amounts.
FixGH #43: The Dashboard Negotiations panel now shows the canonical Current Demand (the same value you see on the Demand tab and Settlement tab). Previously it showed the most recent Demand Sent move, which could differ — including stale or test entries that gave the impression there was no way to correct them.
ImprovedVoided negotiation entries are now filtered out of the Dashboard summary numbers (First Offer / Last Demand / Last Offer), matching the Settlement tab Negotiation Log behavior. The whole app now reads negotiation state through the same single source of truth.
v0.16.0
April 23, 2026
Service Providers Picker + Medical Bill Linking + Tile Sync Fixes
NewGH #38: The Services tab now opens a Service Providers picker when you request a service. It lists Innate Fox (live) and MyFile Runner (coming soon). Click a provider to submit the request — replaces the single hardcoded "Request Investigation" button so firms can eventually route to any vendor they work with.
FixGH #40: When you save bill-request info on a provider card, the "Bill Requests" summary tile at the top of the Medical tab now updates immediately. Previously the tile pulled from a separate data source and ignored your provider card save.
FixGH #41: Medical bills you upload to the Documents tab can now be linked to specific bill rows on the Damages tab. Each bill row has a Document column where you pick the uploaded file. You can also add a bill directly from the Damages tab with the new Add Bill button — no more switching to the Settlement tab to enter a bill manually.
FixThe "Records Requests" and "Overdue Follow-Ups" tiles on the Medical tab now read from the same provider records you edit on the cards below, so they stay in sync when you save.
FixThe "No request logged" AI alert no longer fires for providers where you have already recorded a bill or records request from the provider card.
v0.15.0
April 23, 2026
Negotiation Log Editable with Audit Trail
NewGH #39: Negotiation Log entries on the Settlement tab are now editable — click the three-dot menu on any row to edit amounts, dates, or notes, or void the entry entirely. Voided entries show a strikethrough with the person who voided them and their reason.
NewEvery edit writes a per-field audit record so the full change history is preserved. Voided entries are filtered out of Gap and Last Offer math automatically.
NewThe Demand Letters tab now shows a Current Demand card at the top that reads the canonical demand amount from the Demand tab, so all three tabs (Demand, Settlement, Demand Letters) reference the same number.
ImprovedSoft-delete pattern matches IOLTA trust ledger — nothing is ever hard-deleted, which keeps the audit trail intact for legal review.
v0.14.4
April 22, 2026
Medical Tab Rebuild + Contractor Access + Chronology Upload Fix
FixGH #37: Uploading medical records from the chronology page (and medical-record PDFs from the Documents tab) no longer lands in an error state. Processing now runs in the web process where the uploaded file actually lives, instead of on a separate worker container that could not see it.
FixGH #26 + #30: Contractors who are also service-provider employees (e.g. Innate Fox investigators) are now correctly redirected from the contractor dashboard to the service-provider portal, where they can set their availability. The redirect was previously being swallowed by a try/catch block.
FixGH #31, #32, #33: Provider cards on the Medical tab are now fully editable — Provider Info, Treatment, Records Request, and Billing sub-tabs all have working save handlers. Previously the inputs were read-only or not bound to any state.
NewGH #34: "Medical Bill" and "Insurance Letter" are now selectable in the document-type dropdown when uploading to a journey.
FixGH #35: The Files tab on a provider card now actually uploads files. They appear tagged to the provider and group correctly after refresh.
NewGH #36: Medical-record PDFs uploaded through the Documents tab now automatically flow into the Medical Chronology pipeline for AI extraction, so firms do not have to upload the same file twice.
v0.14.3
April 21, 2026
Task Completion + Skipped Checklist Audit + Demand Single Source of Truth
FixGH #28: Marking a task complete via the Edit Task modal now actually removes it from the Open list. Auto-generated tasks with empty descriptions were being rejected by server-side validation and silently failing to update.
NewGH #27: "Skip & Move" on the stage transition checklist now writes an audit entry per skipped step. Skipped items appear in the Recent Activity feed and in a new Skipped section on the task list, with the person who skipped them and when.
NewGH #29: Demand amount is now stored in one place (the Demand tab) and referenced everywhere else. The Settlement tab Negotiation Log and the Demand tab auto-sync, and the Insurance Information card on the Demand tab auto-populates from the insurance data already entered under Edit Journey.
v0.14.2
April 17, 2026
Investigation Notifications Reach All Firm Staff
FixWhen a contractor submits an investigation form, every firm admin and paralegal at the law firm now receives the notification email — previously only one person (the first admin found in the database) was notified.
v0.14.1
April 16, 2026
Medical Chronology + Conflict Check Fixes
FixGH #17 + #24: The Medical Chronology page now shows all extracted records, vitals, and medications after processing. Previously the processing pipeline was writing the data to the database but the UI was not reading it back.
FixGH #21: The No Conflicts badge on the journey dashboard is now clickable — opens a dialog showing the conflict check results, when it was last run, and a Re-run Check button.
v0.14.0
April 7, 2026
HoLaCe-Billed Line Items — Locked, Confirmed, Auto-Billed
NewSettlement Disbursement now visually locks HoLaCe-managed line items (Demand Letters, AI Record Review) with a lock icon and tooltip — firms cannot edit or remove them
NewConfirmation modal before generating a demand letter — warns the firm that it creates a locked line item on the client-shared Settlement page, idempotent so you are never double-charged
NewConfirmation modal before uploading medical records for AI chronology — same billing guardrail as demand letters
FixDemand letter billing now fires from the Download Letter and Download Both UI buttons (previously only wired to an internal /generate-pdf endpoint that the UI never called)
ImprovedHoLaCe-managed expenses section shows total HoLaCe charges in a summary badge at the top of the Expenses card
Fix43 legacy investigation forms linked to their investigation requests
ImprovedPENDING_REVIEW and REVISION_REQUESTED status enums for proper review workflow
ImprovedELEVATOR added to ViolationCategory enum
ImprovedexternalId/externalSource fields on Contact and Journey for import dedup
ImprovedImportJob model for tracking import progress with polling
ImprovedMobile responsive CSS for marketing homepage
v0.10.2
March 17, 2026
Landlord Records Integrated into Demand Letters and Habitability Reports
FixInvestigationLandlord records now pulled into habitability report generation - Property Owners section lists all landlords with ownership date ranges
FixDemand letter defendant field now includes all landlords from InvestigationLandlord records, joined with "and" when multiple owners exist
ImprovedHabitabilityReportData interface extended with optional landlords array supporting primary flag and ownership date range fields
FixProgress bar clamped to 0-100% across all components
FixTask creation button now works (added type="button")
FixDemand letter page wrapped in Suspense boundary for useSearchParams
FixDocument upload now refreshes via React key pattern instead of page reload
NewAdd Provider form now functional with full API integration
NewDashboard metrics reworked: Active Negotiations + Cases Settled with avg fees
NewAdjuster detection in step checklist with contact form popup
NewReferralSource model added for standardized lead source tracking
ImprovedRoadmap audit completed - 5 features marked completed that were incorrectly listed as planned
ImprovedDate picker year navigation improved with better styling
v0.10.0
January 13, 2026
Unified Demand Letter System - All Case Types Supported
NewUNIFIED SYSTEM: DemandLetter now links to Journey for ALL case types (housing, dog bite, slip and fall, car accident, medical malpractice, workplace injury, product liability)
NewSmart case type detection from Journey data with automatic template selection
NewDemandLetterService pulls data from multiple sources based on case type: investigations for housing cases, medical records for injury cases, contacts for insurance info
NewDemand letter API supports both journeyId (unified) and investigationId (legacy) for backward compatibility
NewCreate page now shows Journeys with approved investigations, providing full case context
ImprovedInvestigation approval workflow navigates with journeyId for unified demand letter creation
ImprovedDatabase schema: journeyId field added to DemandLetter, investigationId now optional
ImprovedScalable architecture - new case types can be added without API changes, just template updates
v0.9.7
January 13, 2026
Demand Letter Creation from Investigation Forms
FixFixed "Investigation not found" 500 errors when creating demand letters from approved investigations
NewNew InvestigationDemandLetter API for creating demand letters from InvestigationForm submissions
NewAuto-generates all demand letter sections (header, facts, violations, damages, demand, closing) from investigation data
ImprovedAutomatic demand letter creation when clicking "Create Demand Letter" after approval
ImprovedSeamless workflow: Investigation submission → Approval → Demand letter creation