Overview
PayCal Version 1.055.000 closes a concentrated engineering cycle covering six version increments since 1.049.000. The work spans a deep security sweep across the full stack, Redis infrastructure hardened to serializable-safe atomicity, a complete CI/CD overhaul, a SOC2 audit trail capable of producing verifiable evidence bundles, a full migration from hardcoded pixel sizes to proportional rem tokens, and expanded internationalization coverage.
This is not a feature-expansion release. It is a platform-integrity release — the kind of cycle that makes everything that follows faster, safer, and more auditable.
Security Hardening
The largest block of work in this cycle is systematic security hardening. Over two formal sweep rounds, the following classes of vulnerability were identified and closed.
Centralised Security Headers
All core HTTP security headers are now emitted through a single authoritative call:
Security::sendCoreSecurityHeaders(). Prior to this change, headers were applied
inconsistently across controllers. Centralising the call eliminates the risk of any future
controller omitting a header by omission.
Information Disclosure
- Exception detail stripped from all API responses — stack traces and internal error messages now log server-side only; callers receive opaque error codes.
- API route map no longer exposed in public responses.
- Test output leak closed — test runner results cannot surface through production endpoints.
Request Forgery and Spoofing
- Open redirect in
BillingControllercheckout-return — fixed with strict same-origin validation. - Stripe webhook endpoint hardened against queue poisoning.
- IP spoofing via
X-Forwarded-For— trusted-proxy gating applied. - CORS
OPTIONSfallthrough — explicit handling added; no implicit pass-through.
Rate Limiting and Key Hygiene
- Rate-limit keys migrated from MD5 to SHA-256.
exec()replaced withproc_openargument arrays wherever shell surfaces existed.escapeshellargapplied to remaining path constructs.
Session and Memory Safety
- Calendar work clipboard moved out of DOM-accessible storage into a sessionStorage scope, then further hardened to an in-memory IIFE variable.
- HKDF fallback visibility audited; non-enumerable
windowglobals enforced for key material. - SettingsController auth guard added — unauthenticated access to settings API endpoints is explicitly rejected.
Auth and Passkey
- Passkey autofill gated to the active sign-in tab only — prevents autofill from triggering in background contexts.
- Auth gate hardening across recovery and passkey registration flows.
- CSRF-safe random entropy (CSRNG) applied wherever token generation previously used weaker sources.
Redis Atomicity
Redis operations across the application have been systematically upgraded from non-atomic patterns to safe, race-free alternatives.
- All
hset + expirecall pairs replaced with atomichsetex. - Token consumption migrated to
GETDEL— single-operation read-and-delete eliminates TOCTOU windows. - Counter increment races and webhook deduplication races fixed with Lua-script atomics.
touchLastSigninmigrated to batchedhset— single round-trip instead of per-field calls.- Persistent connections (
pconnect) introduced for hot paths. WAITreplica confirmation added for critical write paths.
SOC2 Audit Trail
The SOC2 evidence pipeline graduated from a manual-assembly workflow to a fully automated, production-scheduled system.
- Daily systemd timer on production generates the monthly evidence bundle automatically.
- TheLedger now mirrors 13 org governance events — every material organisation action creates an immutable audit record.
- Admin audit trail and org audit read endpoints allow auditors to query evidence directly through the admin surface.
- SOC2 dashboard tables migrated to the shared datagrid component.
- CC1 through CC9 control coverage gaps closed with test suites, trace evidence, and cross-artifact integrity checks.
- ContentView system added — transparency documents served as both HTML and PDF from a single source.
A transparency article covering auth, passkey, and Redis hardening was published alongside a PHP package dependency article.
CI/CD Overhaul
- SHA pinning on all third-party action references — supply-chain safety.
- Least-privilege permissions on all workflow jobs.
- Per-job timeouts to prevent runaway billing.
- Dependabot expanded to cover Composer and npm, running daily.
- Daily dependency security audit script — CVE scanning, version drift detection.
- PHPStan job added to CI matrix as a first-class gate.
- Gitleaks migrated to CLI invocation — no license required.
- CodeQL removed — PHP was unsupported; PHPStan is the static analysis gate.
PHP platform upgraded:
- PHPUnit 12 → 13.
- Platform target: PHP 8.4 (production), 8.5 (dev preview); PHP 8.2 matrix dropped.
Design Token System: px → rem
All hardcoded pixel font-size values across the codebase have been replaced with proportional
rem tokens — calendar, datagrid, common CSS, help, organisations, and settings.
Font sizes now scale correctly with the system base font size, fixing the longstanding issue where accessibility-triggered font-size increases had no effect on several UI surfaces.
The density preference was renamed to Spacing throughout — DB field, PHP, JavaScript, CSS, i18n strings, and tests all updated consistently.
Dependency Modernisation
vlucas/phpdotenvreplaced with a first-partyInfrastructure\Env\Dotenvimplementation — removes a third-party dependency from the environment-loading critical path.- Removed unused packages:
erusev/parsedown,yupmin/magoo(PHP);pdf-lib(npm). - Removed orphaned
vendor/pdependartefact.
Internationalisation
- Six additional pages localised: auth recovery, help/tax-brackets, organisations, profile, security, and sites.
- Admin language editor added — full-width panel with locale tab strip and monospace textarea for in-browser string editing.
- Admin language audit dashboard with
LanguageAuditService— shows missing key coverage per locale. declare(strict_types=1)enforced in all locale files via pre-commit hook.
Premium and UX
- /premium upgrade landing page launched — outcome-focused copy, benefit pillars, pricing clarity.
- Organisation page reframed as a discovery and membership hub — free users see the value proposition rather than a locked gate.
- Profile billing section given outcome-focused messaging and UX improvements.
- XLSX export added to earnings — joins PDF, CSV, and text in the one-click export set.
- Calendar earnings hover tooltip — shows earnings summary for a day without leaving the calendar view.
- Breadcrumb ticket-stub styling applied across document navigation surfaces.
Closing
PayCal 1.055.000 is the platform proving it can hold a consistent security posture across a sustained multi-week engineering cycle. Every change in this release — whether a Redis atomic upgrade, a CI SHA pin, or a rem token migration — is traceable, tested, and auditable.
The SOC2 pipeline now runs automatically. The CI pipeline now audits dependencies daily. The security headers now emit from a single source of truth.
The work of this cycle is infrastructure that the next cycle gets to stand on.
Secure. Auditable. Maintained. This is PayCal.