First to Site
Release 3.6

Release 3.6 Overview

Post-deploy verification, proposals portal, optimistic locking, and candidate environment hardening

Release 3.6 tagged on 17 April 2026 as v3.6.0, with follow-up patches v3.6.1 and v3.6.2 landing on 20 April. The cycle delivered a full post-deploy verification system, a new UX Proposals portal, data-integrity hardening via optimistic locking on the Project entity, and a significant rework of the release pipeline to use persistent per-environment runtime config and a rationalised port scheme.

Items Included

Release & Deployment Infrastructure

Every previous release required manual confirmation that services came back up correctly and that the new build was healthy. This release automates that verification, generates an LLM-summarised diff email, and introduces persistent per-environment runtime config so credentials and tokens survive deploys without manual copy steps. Together they reduce the cognitive load of shipping and the chance of a release going out with missing config.

  1. post-deploy-verify system - Automated verification runs health checks, gathers git changelog, detects PHP/Node versions, and emails a summary with optional Ollama Cloud LLM narrative.
  2. Persistent runtime config - ~/config/<env>/ now holds .env.local, credentials.json, and Google API tokens. The release script copies them into the fresh build, so rotating a secret means editing one file per host.
  3. Symlink rename - Production symlink renamed from ~/source to ~/live; release directories named live-YYYYMMDD-HHMMSS for clarity.
  4. Port scheme rationalisation - Production (3xxxx), preprod (4xxxx), candidate (5xxxx) port allocations for releases and dossier-api processes; post-release service restarts aligned.
  5. Persistent media symlinks - app/public/uploads and app/public/media re-created on every release so user-uploaded content survives a deploy.
  6. Build worktree safety - Release script now copies all runtime files (credentials, tokens, env) into the build worktree before running migrations, preventing half-configured releases.

UX Proposals Portal

Product proposals historically lived in Google Docs and Slack threads, making it hard to show clients a curated list of work in motion. This release introduces a dedicated portal at proposals.ftsonline.com.au that presents upcoming UX upgrades as first-class content with screenshots and context.

  1. Proposals portal - New fumadocs site at proposals.ftsonline.com.au hosting UX Upgrades proposals.
  2. Eight UX feature pages - Initial proposal set covering the highest-impact improvements on the roadmap.
  3. Trello screenshots - Proposal pages embed Trello context so readers can jump back to the source card.

Data Integrity

Stale-write races were silently overwriting admin edits when two sessions touched the same project. This release adds optimistic locking at the Doctrine layer so concurrent saves are caught and rejected with a user-friendly message rather than allowed to clobber each other.

  1. Project @Version - Doctrine-level version column; any UPDATE that targets a stale version fails cleanly.
  2. EasyAdmin form protection - Hidden version field round-trips through the admin form; explicit $em->lock() check on save. (Note: this was later softened in v3.7.1 after false-positive reports; see release 3.7.)
  3. 409 Conflict response - OptimisticLockExceptionListener returns a proper JSON 409 for API/XHR/JSON-accepting requests; HTML flows still get the flash + redirect.

Dossier-API Enrichment

Routing all backend parcel enrichment through dossier-api gives the platform a single cache-aware source of truth for parcel intelligence. This release finishes that migration and adds an LGA-based water authority fallback so untitled parcels still resolve a sensible authority.

  1. Backend parcel enrichment via dossier-api - All ProjectInsightEnrichmentService reads now go through dossier-api.
  2. LGA water authority fallback - Untitled parcels without geometry still resolve a water authority via LGA → retailer lookup (Yarra Valley, South East Water, Greater Western Water, etc.).
  3. Reject fuzzy SPI matches - Geocoder matches below a confidence threshold are now rejected to prevent wrong-LGA assignments.

Admin & Ordering Fixes

Targeted fixes to daily workflows: the PO number field was surfaced on project edit forms (later revised in v3.7), draft order email notifications were guarded, and a slow-save issue on invoice forms was resolved.

  1. Admin project edit: PO Number field - Exposed on the project edit form. (Revisited in v3.7.2 - moved to live on the invoice entity only.)
  2. Draft order email guards (v3.6.1) - ProjectOrderNoteListener now suppresses email dispatch for draft/pending notes.
  3. Order note notification regressions (v3.6.2) - Fixed email flow breakages introduced by earlier notification refactors.
  4. DA/BP email automation (v3.6.2) - Order creation from DA/BP automation emails now handles edge cases in DAEmailHandler / EmailHandler.
  5. Invoice form "extra fields" error - Resolved validation error that was blocking some invoice saves.
  6. Title prediction days configurable - TITLE_PREDICTION_DAYS env var with a 28-day default; per-estate overrides land in v3.7.
  7. Sale Check PDF accuracy - PDF export now reflects current on-screen form state rather than the last-saved snapshot.

Messaging / Email

Mailer DSN handling and line-length bugs in production SMTP were causing intermittent delivery failures and duplicate estate RFI items from the sync job. Both are resolved.

  1. SMTP line-length fix - Long deploy-report emails no longer fail on SMTP's 998-char line limit.
  2. DEPLOY_MAILER_DSN default - Defaults to localhost:1025 (server MailHog) unless overridden.
  3. Duplicate estate RFI items - Project sync no longer creates duplicate RFI items when an estate is re-synced.
  4. Allow DA email relabeling on all environments - Was previously restricted to a subset.

How To Read This Section

Each child page covers one deliverable or a tight group of related items. The sidebar follows the groupings above. Items marked with a revision note (e.g. PO Number field) are touched again in release 3.7 and you should read both entries together.