Production Release — August 28, 2026
Release boundary
This packet promotes the complete verified staging delta after production commit cf81eeea39e6b03722f712dbd2b4e2824034695f.
- Verified application baseline: staging commit
a39b501d014fc776f0d97cacde91ce17b6fc2d77. - Baseline CI: GitHub Actions run 33137482095, successful at the exact baseline commit.
- Baseline deployment: GitHub deployment
6134789694, successful in the Bizcom staging environment at the exact baseline commit. - Repository delta before these release notes: 72 files, 2,863 insertions, and 141 deletions.
- History note: Git reports 437 staging-only commits because earlier production promotions were squash-merged. The current production commit is an ancestor of staging, and the release is governed by the actual tree delta and exact-SHA evidence rather than the raw commit count.
The final promotion PR must identify its own head SHA and prove that its tree contains this baseline, the independently verified download-filename repair from PR #369, the release-blocking client fee-total authorization repair, and the release documentation from PR #367, with no other content delta.
Included improvements
Security and authorization
- Time-tracking ownership and role enforcement.
- Private upload-prefix enforcement with a compatibility path for existing public blog images.
- Server and client blog-content sanitization.
- Content Security Policy cleanup, map-host allow-listing, and fail-closed public anti-bot checks.
- Escaped feedback email content.
- Enforced service-pricing permission across both service detail and client-level fee totals.
Correctness and operational workflows
- Correct AR aging buckets, draft-free receivable totals, centavo-preserving currency output, visible inline status failures, and Manila due-date handling.
- Consistent compliance-pipeline assignment and first-step timestamps across task-creation paths.
- Stuck-task notification deduplication, Sunday recurrence preservation, task input guards, and client invoice visibility restrictions.
- Approved-leave revoke with atomic balance restoration and a staff self-approval guard.
- Serialized email-queue processing and truthful bulk-send failure reporting.
- Client ticket unread approximation based on the latest message author.
- Zod request validation for payment, leave, task, and service routes.
User experience, accessibility, and public pages
- Retryable query failures and generic mutation-failure feedback.
- Confirmation dialogs for four destructive admin actions.
- Audited contrast improvements.
- Route-specific canonical and Open Graph metadata with portal-route cleanup.
- Truthful feedback-to-Paperclip routing state.
- Safe content-disposition fallback filenames without corrupting ordinary ASCII download names.
- Regression coverage for invoice visibility, leave self-approval, task enums, Sunday scheduling, stuck-task deduplication, and SPA metadata navigation.
Documentation only
- Read-only Xero integration architecture and synthetic proof plan. It does not enable or configure a live integration.
Database and dependency impact
Database
No production database migration or data mutation is required.
mainandstaginghave the same SQL migration inventory through migration 050.- No migration file is added, removed, or changed by the release delta.
- The
shared/schema.tsdelta contains request-validation schemas only; no Drizzle table definition changes are present. drizzle-kit pushremains disabled. It must not be used for this release.
Dependencies
- Adds
dompurifyand its type package for client-side HTML sanitization. - Adds
jsdomas a development dependency for browser-like regression tests. - The production dependency audit at the verified staging baseline reported no high-threshold vulnerabilities.
Deferred or partial items
These are not represented as fully resolved by this release:
- Moving legacy blog images into the public-image prefix remains a separately coordinated data migration; the compatibility path remains in place.
- Durable email claim timestamps and failed-email retry counters require a future schema migration. This release supplies process serialization and truthful reporting only.
- Database-level enum/check constraints and historical data backfills for task status, Sunday recurrence, and first-step timestamps remain migration-gated.
- HR permission-preset mapping remains a separate governed data change.
- Client ticket unread state is an author-based approximation, not a persistent per-message read receipt.
- Xero implementation remains approval-gated and disconnected.
Production procedure
- Merge the release-document carrier into
stagingafter its checks pass. - Open one protected
stagingtomainPR with the final exact head SHA, this release packet, and the independent verifier disposition. - Require successful CI on the exact promotion head and resolve all review threads.
- Squash-merge through the protected branch rule.
- Confirm the resulting
maintree is identical to the promoted staging tree. - Confirm the production deployment record reports success for the resulting
maincommit. - Run public health checks and authenticated, read-only release-relevant smoke checks.
- Reconcile production feedback individually: resolve only items proved fixed in production; leave partial or deferred items acknowledged or in progress with an evidence link.
Rollback
Because this release has no database migration, rollback is code-only:
- Revert the production promotion through a new protected PR to restore the pre-release application tree at
cf81eeea39e6b03722f712dbd2b4e2824034695f. - Wait for the resulting production deployment and verify its exact SHA.
- Repeat public health and authenticated smoke checks.
- Reopen any feedback item whose resolved evidence depended on the reverted release.
Do not force-push main, mutate the production database, or delete release evidence as part of rollback.
