PASS Installer rejects wrong code
PASS 51 real starter records imported
PASS Opening stock remains unknown
PASS Installer cannot run twice
PASS Login establishes an authenticated session
PASS Invalid login rejected #1
PASS Invalid login rejected #2
PASS Invalid login rejected #3
PASS Invalid login rejected #4
PASS Invalid login rejected #5
PASS Invalid login rejected #6
PASS Invalid login rejected #7
PASS Invalid login rejected #8
PASS Repeated failed logins are rate limited
PASS Passwords stored as hashes
PASS Temporary-password account cannot read inventory
PASS Temporary password can be changed without losing the session
PASS Disabling an account invalidates existing sessions
PASS Disabled account cannot sign in
PASS Manager cannot administer accounts
PASS Staff cannot modify product master
PASS Staff cannot approve counts
PASS Administrator cannot remove their own access
PASS Receipts blocked until opening approved
PASS Count retry is idempotent
PASS Opening approval posts stock
PASS Opening count creates unknown-expiry batch
PASS Staff cannot change batch expiry details
PASS Manager can annotate opening batches
PASS Count cannot be posted twice
PASS Receipt retry does not double stock
PASS Earliest dated batch consumed first
PASS Negative stock prevented
PASS Rejected movement rolls back
PASS Waste requires a reason
PASS Staff cannot adjust stock
PASS Expiry-tracked receipt needs date or explicit unknown
PASS Stale physical count cannot overwrite new stock
PASS Counted zero differs from unknown stock
PASS Transfer posts both locations atomically
PASS Barcode leading zeroes preserved
PASS Barcode cannot be linked to two products
PASS Posted product cannot change base unit
PASS Stale product edit is rejected
PASS Piece quantities must be whole numbers
PASS Purchase-order retry is idempotent
PASS Partial receipt reduces on-order stock
PASS Order over-receipt blocked
PASS Invalid order receipt rolls back stock
PASS OAuth credentials encrypt and decrypt
PASS Missing CSRF token rejected
PASS Matching CSRF token accepted
PASS Prepared JPEG validated from real bytes
PASS Oversized photo rejected
PASS Excess image dimensions rejected
PASS Renamed PNG rejected by server
PASS Invalid image rejected
PASS Image re-encoding removes trailing metadata
PASS Inventory export excludes passwords and Google tokens
PASS Staff cannot read costs, account list or Google settings
PASS Manager cannot connect Google
PASS OAuth rejects forged state before network request
PASS Manager cannot change Google credentials
PASS Google configuration requires password reauthentication
PASS Google credentials can be saved from Settings
PASS Google client secret is encrypted in database
PASS Google client secret is never returned in app state
PASS OAuth uses saved client ID without exposing its secret
PASS Blank secret preserves the current value for the same client
PASS Sheets export keeps photo schema
PASS Pending photos do not export an obsolete Drive link
PASS API status works without an authenticated session
PASS API blocks unauthenticated inventory reads
PASS API blocks GET mutations
PASS API login requires a session CSRF token
PASS API login works with correct session and credentials
PASS API inventory read works with signed-in session
PASS API enforces staff role on account writes
PASS API blocks staff from full inventory export
PASS New product preserves an unknown scanned barcode
PASS Product-creation retry is idempotent
PASS Duplicate scanned barcode rejects new-product creation
PASS Failed barcode linking rolls back product creation
PASS Concurrent deductions allow only one sufficient-stock write
PASS Concurrent deductions preserve exact remaining stock
PASS Concurrent reviewers cannot approve and reject the same count
PASS Ledger, batches and balance agree at BAR
PASS Ledger, batches and balance agree at DRY

88 checks passed on mysql.
