Lawn Pro 1.0.0 — executed checks
PHP 8.3.6 / SQLite memory; see VERIFICATION.md for test scope.

PASS Initial setup creates exactly one super administrator
PASS Initial setup cannot be repeated
PASS Business portal rejects platform credentials
PASS New businesses start with no customer or job data
PASS Customer payment preferences persist independently
PASS Cross-business customer reads denied
PASS Cross-business customer updates denied
PASS New visit takes a customer and payment snapshot
PASS Historical job details do not change with customer edits
PASS Stale customer update cannot overwrite a concurrent edit
PASS A job cannot be completed before arrival
PASS Arrival records time and starts work
PASS Pause and resume are explicit transitions
PASS Completion excludes saved pause time
PASS Marking invoice sent does not mark payment received
PASS Cash receipt is recorded separately
PASS Time corrections retain timestamp evidence and audit reason
PASS Same request ID produces one job only
PASS Reused request ID rejects a changed payload
PASS Recurring round pre-fills 12 weeks without duplicates
PASS Moving one visit preserves its original recurrence identity
PASS Future cycle replacement preserves manual exceptions
PASS Blocked dates reject new one-off bookings
PASS Bulk moves are atomic on stale selections
PASS Cross-tenant job mutation denied
PASS Customer limit enforced server-side
PASS Plan entitlement and permission are separate checks
PASS Expired business is read-only without deleting data
PASS Suspended business cannot read operational records
PASS Last business owner cannot deactivate or remove self
PASS Staff cannot create customers or manage users by direct action
PASS Permission changes apply to existing signed-in session
PASS Revoked membership denies subsequent requests
PASS Admin cannot grant platform authority through role injection
PASS Pending invitation reserves a seat
PASS Invitation is single-use and tenant scoped
PASS Resending invalidates the old invitation
PASS Recovery response does not disclose unknown accounts
PASS Password reset invalidates other sessions and cannot be replayed
PASS Expired password reset token rejected
PASS TOTP matches RFC 6238 test vector (six-digit truncation)
PASS TOTP secret encrypted at rest
PASS Password login requires second factor when enabled
PASS Recovery code signs in once only
PASS Same TOTP step cannot be replayed
PASS Password reset does not disable existing MFA
PASS Report uses completion date in business timezone
PASS All-date unresolved report includes older unpaid work
PASS Archive keeps historical reports and stops future work
PASS Calendar range is bounded
PASS Invalid calendar dates rejected
PASS Cross-business assignee rejected
PASS Permission dependencies prevent unusable delegated roles
PASS CSRF is required for state changes
PASS Rate limits reject repeated sensitive actions
PASS Password hashes are irreversible and verify correctly
PASS Platform accounts have no universal operational bypass
PASS Last super administrator cannot be deleted
PASS Global deletion preserves work and anonymises user
PASS Super-admin retries do not create duplicate plans
PASS Weekly prices remain unset until configured
61 tests; 0 failures; driver=sqlite

Front controller CLI harness (not network HTTP):
PASS Anonymous session bootstrap works
PASS Anonymous direct customer endpoint denied
PASS Front controller rejects missing CSRF
PASS Front controller rejects GET mutation
PASS Business login route authenticates with session rotation
PASS Authenticated session resolves correct business
PASS Daily API returns saved server jobs
PASS Business user denied direct super-admin endpoint
PASS Application shell emits relative base and shared assets
PASS Logout route completes
PASS Logout revokes protected access
11 front-controller checks; 0 failures (CLI request harness, not network HTTP).
