Release Notes

Currently running: 20260915.2 · bf73e62
Version
20260915.2
Built
2026-09-15T21:49:10-0700
Commit
bf73e621f9978a6ce22fbbfdd05a930c17621f4f
Commit date
2026-09-16T04:47:53Z

Changes in this build
  • fix(reports): normalise the contractor's cost to monthly before taking the margin (WI #3387)
  • fix(security): generate the download temp path instead of deriving it from the blob name (WI #3232)
  • fix(security): reject unowned blob containers at the /blobs routes (WI #3232)
  • fix(reminder): give the close-out heartbeat a third outcome value (WI #3225)
  • test(tz): pin the suite to Pacific and run a second CI leg in UTC (WI #3222)
  • fix(dates): pin getDateTime to UTC so DATE columns keep their day (WI #3224)
  • docs: record that the test suite runs in the wrong timezone (WI #3222)

History

Release Notes

A running, hand-curated digest of what shipped in Client-Contracts, grouped by calendar month (newest first). Each entry links to its work item, the merging pull request, and the merge commit.

Maintenance. Once a month, an engineer sweeps the merged PRs from git log --merges --first-parent main and prepends a new section to this file. Internal-only changes (CI tweaks, dependency bumps, untracking files) are filtered out; user-visible features and bug fixes are kept. Edits to this file ride in their own PR — there's no auto-generation.


April 2026

A major month — billing-model overhaul, QuickBooks reconciliation, RBAC foundation, and a long tail of UI / data-quality improvements.

Billing model

  • #935 — refresh /billing-methodology to match current logic (PR #1453 · 35dedea, Apr 24)
  • #934 — billing: honor paid_holidays / paid_vacation on monthly contracts (PR #1425 · d6a7a4d, Apr 22)
  • #930 — billing: computeAbsenceCost honors PRORATION_CUTOFF (PR #1417 · 3fdf3f7, Apr 21)
  • #901 — billing: honor paid_holidays / paid_vacation on daily / hourly contracts (PR #1395 · da5ad44, Apr 21)
  • #900 — billing: apply PRORATION_CUTOFF only to monthly contracts (PR #1392 · 5fbc884, Apr 20)
  • #899 — billing: refactor daily / hourly to hours-first (PR #1389 · 7988925, Apr 20)
  • #898 — fix: daily / hourly daysWorked uses absence / vacation hours, not row count (PR #1388 · fc10f55, Apr 20)
  • #897 — billing: unify daily / hourly math (daysWorked = weekdays − holidays − absences − vacation) (PR #1387 · 3ee7eea, Apr 20)
  • #896 — UI: hide paid_holidays / paid_vacation in forms, pages, and reports while the model stabilized (PR #1386 · 94f4856, Apr 20)
  • #874 — billing: mirror billable resource.InvoiceAdjustment rows onto invoices (PR #1369 · 7d4a6ff, Apr 18)
  • #879 — billing: absences tracked on resource.Absence (billed_at), not adjustments (PR #1360 · f15e72a, Apr 18)
  • #863 — billing: proration formula cutoff at 2026-04-01 (PR #1343 · 75c408f, Apr 17)
  • #847 — invoices: unified billing model — derive calculation from rate type; deprecate proration_scheme (PR #1313 · 55218b7, Apr 16)

QuickBooks reconciliation

  • #948 — QB reconciliation: per-client mismatch totals (PR #1447 · 3cc7dba, Apr 24)
  • #940 — resource Gantt: link resource-contract bars to provider app (PR #1448 · e0e4215, Apr 24)
  • #938 — QB reconciliation: link Invoice # to ClientInvoice + default-sort by Invoice # (PR #1449 · 6067c2b, Apr 24)
  • #943 — closeOut: number new invoices from MAX(existing) + 1, not count + 1 (PR #1435 · a381b81, Apr 23)
  • #929 — qbRecon: use client.qb_id for explicit client↔QB customer mapping (PR #1414 · 620fc88, Apr 21)
  • #927 — qbRecon: join intuit.Customer on qb_id, not id (PR #1408 · a7ea309, Apr 21)
  • #908 — qbRecon: annotate mismatches to preserve investigation findings (PR #1404 · 827e349, Apr 21)
  • #906 — qbRecon: subtract billed absences when computing dbTotal (PR #1398 · db686a6, Apr 21)
  • #846 — reports: QuickBooks reconciliation report (PR #1312 · 7c5df6f, Apr 16)
  • #848 — reports: import missing invoices from QuickBooks per client (PR #1316 · 777dfe3, Apr 16)
  • fix: QB reconciliation doc_number matching independent of customer match (PR #1321 · 2eea4e7, Apr 16)
  • reports: add client filter to QB reconciliation report (PR #1317 · c70e58c, Apr 16)

Reports & access control

Invoice & contract UX

  • #903 — client: allow uploading an MSA PDF (PR #1452 · 60c94dc, Apr 24)
  • #902 — blobs: redirect back to parent record after upload / delete (PR #1451 · 04d7052, Apr 24)
  • #931 — resource Gantt: min-width + border for very short contracts (PR #1422 · 9eb65b3, Apr 22)
  • #886 — fix: contract invoice page shows Final Amount after absences (PR #1366 · 0ca263a, Apr 18)
  • #885 — fix: client-invoice Details footer used wrong context for absences total (PR #1365 · 26f5bbc, Apr 18)
  • #884 — fix: delete confirms prompt twice on form-based delete buttons (PR #1364 · 1538942, Apr 18)
  • #883 — invoices: gate contract-invoice delete button + improve confirm message (PR #1363 · fa12f14, Apr 18)
  • #882 — invoices: add Delete invoice button on the client invoice page (PR #1362 · 276ce78, Apr 18)
  • #881 — fix: store actual service period on close-out invoices (PR #1361 · d987230, Apr 18)
  • #875 — fix: contract invoice page was double-counting absence deductions (PR #1357 · ba59d5d, Apr 17)
  • #877 — fix: cascade-delete adjustments when deleting a contract invoice (PR #1356 · 499ad46, Apr 17)
  • #872 — invoices: rename Comments column header "Comment" to "Details" (PR #1353 · b06a6d0, Apr 17)
  • #866 — invoices: show billable units (days / hours) for daily & hourly lines (PR #1352 · e5edaac, Apr 17)
  • #871 — invoices: add Total column to the client invoices list (PR #1351 · 28c77d8, Apr 17)
  • #869 — invoices: mark prorated lines with (prorated, date - date) note (PR #1349 · 5a75071, Apr 17)
  • #868 — invoices: add Comments section header on the client invoice page (PR #1348 · e033e9d, Apr 17)
  • #867 — invoices: hide Dept Code table when no lines have a dept code (PR #1347 · 3090058, Apr 17)
  • #865 — invoices: surface adjustments and absences on the client invoice page (PR #1346 · 0c51aa6, Apr 17)
  • #864 — invoices: itemize absences on the contract invoice page (PR #1345 · 67307f1, Apr 17)
  • fix: contract invoice detail page crash on missing resource contract (PR #1344 · d92aede, Apr 17)
  • #849 — invoices: add ability to approve draft invoices (PR #1319 · f549c40, Apr 16)
  • #836 — invoices: add bulk generation for a date range per client (PR #1318 · 8461598, Apr 16)
  • #150 — invoices: custom message block for client invoices (PR #1309 · 90e1ecf, Apr 15)
  • #838 — invoices: split client invoices by invoice_group on close-out, surface group on contract detail (PR #1297, PR #1298, Apr 14)
  • #836 — invoices: add per-client and global monthly close-out actions (PR #1292, PR #1293, Apr 14)
  • #835 — invoices: add status / generated_by fields, monthly auto-generation cron, status & source badges (PR #1289, PR #1290, PR #1291, Apr 14)
  • fix: stack action buttons into rows on client-invoices page (PR #1320 · f46001d, Apr 16)
  • fix: zero-pad invoice numbers to 4 digits (e.g. YELL-0001, not YELL-1) (PR #1322 · d391560, Apr 16)
  • #281 — feat: add typeahead suggestions for contract team field (PR #1282, Apr 13)
  • fix: redirect to contract page after update instead of using back (PR #1283, Apr 13)

Security & infra

  • #275 — security: obfuscate stored PDF file names with UUIDs (PR #1315 · e98660c, Apr 16)
  • #828 — security: enable Content Security Policy in report-only mode (PR #1310, Apr 15)
  • #845 — CSP phase-1 follow-up (PR #1355 · 1334665, Apr 17)
  • #855 — infra: derive SESSION_SECRET from uniqueString(resourceGroup().id) (PR #1354 · ae2e50c, Apr 17)
  • #369 — fix: remove insecure TLS bypass from email transport (PR #1281, Apr 13)
  • #829 — auth: redirect unauthenticated users to sign-in instead of returning 401 (PR #1277, Apr 13)
  • #870 — auth: add dev-only auth bypass via X-Dev-User header (PR #1350 · 50a0133, Apr 17)
  • #841 — cleanup: remove cosmos_id references from contract renew (PR #1327, Apr 16)
  • #851 — contracts: add cancelled flag, skip cancelled from billing (PR #1325, Apr 16)
  • fix: coerce cancelled checkbox value to Boolean for Prisma (PR #1330 · a930b0a, Apr 16)
  • #769 — test: add Jest framework and baseline test coverage (PR #1280, Apr 13)
  • #767 — reliability: add distributed lock for in-process cron jobs (PR #1247, Apr 11)

Release-notes plumbing (this page)

  • #829 — release-notes: pipeline generates build-info.json and applies OCI labels (PR #1254, Apr 12)
  • #829 — release-notes: render with layout and expose build info (PR #1253, Apr 12)

March 2026

Quiet month — branch sync to prd only, no feature merges.


October 2025

  • New report: Paid Vacation (Oct 30)

July 2025

  • #398 — Client Invoice List and Client Invoice Detail (PR #711, Jul 29)

May 2025

  • #184 — audit logging: contract comments and discounts (PR #673, May 7)
  • charts: remove decimals from y-axis (May 10)

April 2025

  • Add Redis session store and logging utility (Apr 2)

December 2024

  • invoices: add invoice sections (PR #596, Dec 9)

November 2024

  • delivery cost: total by month (Nov 24)
  • delivery cost: per-month breakdown (Nov 22)
  • delivery cost: column + total in main table (Nov 18)
  • add Payments section (Nov 6)
  • client export to spreadsheet (Nov 1)

October 2024

  • fix month charts (Oct 28)
  • replace Contract Start with Margin % column (Oct 24)
  • export all contracts (Oct 7)

September 2024

  • #291 — margin percent column (Sep 19)
  • alternative charting libraries (Sep 12)
  • filter comments by service date (Sep 11)
  • export to spreadsheet on additional reports (Sep 11)
  • filter contracts longer than one year (Sep 11)

August 2024

  • monthly contracts report fixes (Aug 7)
  • rename of monthly contracts report (Aug 3)

July 2024

  • set up CI with Azure Pipelines (Jul 15)

May 2024

  • support daily and hourly rate types (May 4)

Earlier (2021–2022)

Project foundation: initial CI setup, admin group bootstrapping, and miscellaneous early commits. Not individually catalogued — git log --first-parent main is the source of truth for that period.