Commit Graph
11 Commits
Author SHA1 Message Date
popertots 01e7cc575d fix: frontend payment surfaces — SCA wire shapes (explicit token precedence), mock token parity, infinite-loop guard, money display, delete-account re-auth, admin progress UI, mobile touch targets
- new_card_token uses explicit newCardToken ?? verificationToken precedence on every charge surface (BookingFlow, UserPaymentModal, TipPayment, PaymentModal, TillPurchases, account gift-card buy); dead verification_code/consent fields + ScaFallbackConsentDialog removed from payment flows
- mock mints cnon:sca-... tokenize-results and tokenizeWithVerification returns verificationToken:null for new cards (real-SDK parity so save-card works in dev)
- UserPaymentModal infinite /payment-methods fetch loop guarded; formatCurrency(totalPaid) no longer 100x too small
- delete-account dialog collects current_password + fresh 2FA code; admin 'Begin appointment'/'Complete' wired to /admin/bookings/{id}/progress
- mobile: 44px touch targets, active: feedback, TimeSlotPicker 50dvh, dialog close sizing, .no-scrollbar utility, CSP meta, receipt fields escaped
- vitest: policy.ts cross-check + ScaFallbackConsentDialog component tests (svelte project via happy-dom)
2026-08-22 00:34:50 +01:00
popertots b7122be3a0 fix: SCA review round + gitea pipeline green — GDPR audit scrub, backend test gaps, frontend SCA/Square-API, docs parity
7 review agents (pipeline run, self-review, codebase-context, frontend-placement,
backend testing-gaps, Square-API, docs-parity) audited the SCA-primary work.
ALL findings fixed, including every pre-existing red CI job:

GDPR (HIGH):
- anonymize_user() now scrubs admin_audit_log.target_user_id (mirrors
  delete_guest_user) so 2fa_fallback_charge rows (customer id + card_last4 PII)
  no longer survive registered-user account deletion; gdpr test added

BACKEND TEST GAPS (all 10):
- delivery-unavailable 503 branch: prod-tag predicate test + dev-variant marker
- twoFactorFallbackEnabled alias/case/default matrix tests + exported wrapper
- insertTwoFAFallbackAudit details-JSON shape + audit-row assertions for all
  6 gate sites (booking/tip/gift-card/payment-method/terminal/till, both actors)
- CreateTerminalPayment.VerificationToken: passthrough, too-long 400, 2FA-skip,
  token-less fallback + SCA-required (new terminal_sca_test.go)
- isVerificationRequiredError at all 5 charge sites (402 + code:verification_required)
- customer_initiated handler-level assertions (MIT false admin / CIT true customer)
- Mock: ApprovePendingVerification, ChallengeResult auto/deny, _deny token suffix,
  parseVerifyToken unit tests

FRONTEND SCA + Square-API (CRITICAL):
- tokenizeSavedCardWithVerification reads result.token (the verified token) not
  result.verificationResult (deprecated verifyBuyer shape — saved-card SCA could
  never succeed in production before); parseTokenizeVerificationResult pure fn
  extracted + pinned in square.test.ts; 'verified' with no token proceeds tokenless
- HIGH: saved-card idempotency key regenerated after a definitive 402 (fresh token
  under the same key = IDEMPOTENCY_KEY_REUSED dead-loop); kept on 503/cancelled
- challenge-cancelled copy no longer promises a 2FA fallback the UI doesn't show;
  'waiting for approval in your banking app' state on CIT surfaces
- sca-unavailable demotion resets per attempt; card selection disabled mid-challenge;
  genuine saved-card declines no longer relabeled 'requires verification';
  modal-close guard during processing; retry affordance standardized

PIPELINE (every red job now green):
- prod-tag build break fixed (shared square stub + test_helpers_test.go, prod-safe)
- govulncheck: x/image 0.45.0 bumped (x/text resolved); go mod tidy clean
- race: TestDeleteAccount_InvalidatesSquareCustomerCache made deterministic
- DAV_ADMIN_PASSWORD placeholder in .env.example (compose config passes)
- frontend: prettier 28 files, eslint, a11y 38 errors, knip (currentZIndex),
  deps in-range, audit vulns (nanoid/postcss) — all fixed; 67 vitest cases

DOCS PARITY (6 DRIFTs + 5 GAPs): payments doc Ch4/Ch14/Appendix A, Technical
Manual 2FA + counter-reset + payment sections, README test counts + SNAPSHOT_ENC_KEY,
Feature Catalog, .env.example REQUIRE_2FA — SCA-primary/2FA-backup posture verified
against code everywhere

Verified: 26/26 dev + 24/24 prod packages, both vet tags, golangci-lint/staticcheck/
gosec 0 on both tags, gitleaks clean, 2,464 backend + 67 frontend tests.
2026-08-22 00:34:50 +01:00
popertots 6d82535780 fix: adversarial review round — replay-rescue double-charge, discount credit, 2FA/per-IP limits, snapshot encryption, refund reconciliation, VAT, frontend parity, tests+docs
Addresses the adversarial fresh-eyes audit (findings A1-A20) plus review-round fixes:
- CRITICAL A1: replay-by-key rescue cross-checks replayed CreatedAt; ccof blind-fail leaves pending with CRITICAL + notification instead of clawing back
- A2/A3/A4: till idempotency key restored to unconditional hash; tip rejected in CreateBookingPayment; campaign discount now reduces the charged amount (deposit credit)
- A5: admin notifications on blind-fail, manual-refund re-arm, cap-stranded charge-group, webhook FAILED/REJECTED refunds
- A6/A10: BuyGiftCard idempotency user-scoped; gift-card slot scan advances past failed rows
- A7/A14/A15: 2FA user+IP limiter, SNAPSHOT_ENC_KEY startup validation, accurate pepper/log-delivery docs
- A8/A9: snapshot encryption on all write+reuse sites; MPV->SPV effective voucher type (single VAT point)
- A11/A12/A13/A16: amount-aware refund reconciliation; completed-booking refund re-validation; till retry dedup; PaymentWasRefunded on SquareClient interface
- A17/A18/A19/A20: CI runs npm test; confirm_overflow_tip frontend dialog; unknown-event admin notification; mock token redaction
- M7 ConfirmOverflowTip, M9 snapshot encryption, C1 discount ordering regression test
- Frontend vitest framework (41 tests), backend coverage for fixed functions, docs corrected (2,269 tests, SUPPORT_EMAIL tokens, resolution status)

All 25 backend packages pass; frontend 41/41; build + env-docs green.
2026-08-22 00:34:50 +01:00
popertots ae2acc45c3 chore: bump eslint 9.39.4 -> 9.39.5
CI / Env docs check (push) Successful in 1m46s
CI / Docker compose check (push) Successful in 51s
CI / Nginx config check (push) Successful in 55s
CI / Frontend deps check (push) Successful in 1m52s
CI / Frontend major deps (push) Failing after 1m6s
CI / Go build (push) Successful in 2m14s
CI / Frontend build (push) Successful in 1m29s
CI / Secrets scan (push) Successful in 2m26s
CI / Knip (push) Successful in 1m4s
CI / Frontend a11y check (push) Successful in 2m18s
CI / Go vet (prod) (push) Successful in 1m51s
CI / Go vet (dev) (push) Successful in 2m11s
CI / go mod tidy (push) Successful in 40s
CI / Staticcheck (prod) (push) Successful in 2m43s
CI / Frontend QC (audit) (push) Successful in 58s
CI / Go vulnerabilities (push) Successful in 1m27s
CI / Staticcheck (dev) (push) Successful in 3m20s
CI / golangci-lint (push) Successful in 3m30s
CI / Frontend QC (typecheck) (push) Successful in 1m26s
CI / Frontend QC (lint) (push) Successful in 1m54s
CI / Security scan (dev) (push) Successful in 4m38s
CI / Security scan (prod) (push) Successful in 4m2s
CI / Svelte strict check (push) Successful in 57s
CI / Tests (prod) (push) Failing after 3m55s
CI / Tests (dev) (push) Failing after 4m9s
CI / Race (prod) (push) Failing after 7m35s
CI / Race (dev) (push) Failing after 7m44s
2026-07-11 00:31:40 +01:00
popertots a2b4f84503 chore: bump @eslint/js 9.39.4 → 9.39.5
CI / Env docs check (push) Successful in 1m14s
CI / Secrets scan (push) Successful in 1m17s
CI / Go build (push) Successful in 1m17s
CI / Frontend deps check (push) Successful in 1m17s
CI / Frontend major deps (push) Failing after 1m11s
CI / Docker compose check (push) Successful in 1m38s
CI / Nginx config check (push) Successful in 1m40s
CI / Go vet (dev) (push) Has been cancelled
CI / Go vet (prod) (push) Has been cancelled
CI / golangci-lint (push) Has been cancelled
CI / Staticcheck (dev) (push) Has been cancelled
CI / Staticcheck (prod) (push) Has been cancelled
CI / Security scan (dev) (push) Has been cancelled
CI / Security scan (prod) (push) Has been cancelled
CI / go mod tidy (push) Has been cancelled
CI / Tests (prod) (push) Has been cancelled
CI / Tests (dev) (push) Has been cancelled
CI / Race (prod) (push) Has been cancelled
CI / Race (dev) (push) Has been cancelled
CI / Go vulnerabilities (push) Has been cancelled
CI / Knip (push) Has been cancelled
CI / Frontend a11y check (push) Has been cancelled
CI / Frontend build (push) Has been cancelled
CI / Svelte strict check (push) Has been cancelled
CI / Frontend QC (audit) (push) Has been cancelled
CI / Frontend QC (typecheck) (push) Has been cancelled
CI / Frontend QC (lint) (push) Has been cancelled
2026-07-10 21:25:22 +01:00
popertots e896591098 chore: upgrade npm deps — vite 8, prettier plugins, @types/node, @eslint/compat
CI / Docker compose check (push) Successful in 14s
CI / Env docs check (push) Successful in 15s
CI / Nginx config check (push) Successful in 18s
CI / Frontend deps check (push) Successful in 27s
CI / Frontend major deps (push) Failing after 27s
CI / Go build (push) Successful in 35s
CI / Secrets scan (push) Successful in 41s
CI / Frontend build (push) Successful in 43s
CI / Knip (push) Successful in 28s
CI / Frontend a11y check (push) Successful in 1m35s
CI / Go vet (prod) (push) Successful in 2m11s
CI / go mod tidy (push) Successful in 42s
CI / Go vet (dev) (push) Successful in 2m18s
CI / Frontend QC (audit) (push) Successful in 48s
CI / Staticcheck (prod) (push) Successful in 2m57s
CI / Staticcheck (dev) (push) Successful in 3m1s
CI / Go vulnerabilities (push) Successful in 1m27s
CI / golangci-lint (push) Successful in 3m41s
CI / Frontend QC (typecheck) (push) Successful in 1m35s
CI / Frontend QC (lint) (push) Successful in 1m51s
CI / Security scan (prod) (push) Successful in 4m29s
CI / Security scan (dev) (push) Successful in 4m44s
CI / Svelte strict check (push) Successful in 1m49s
CI / Tests (prod) (push) Successful in 3m30s
CI / Tests (dev) (push) Successful in 3m57s
CI / Race (prod) (push) Successful in 7m14s
CI / Race (dev) (push) Successful in 7m25s
Upgrades applied:
  @types/node: 22.20.1 → 26.1.1
  @eslint/compat: 1.4.1 → 2.1.0
  prettier-plugin-tailwindcss: 0.7.4 → 0.8.0
  prettier-plugin-svelte: 3.5.2 → 4.1.1 (formatted textarea.svelte)
  vite: 7.3.6 → 8.1.4
  @sveltejs/vite-plugin-svelte: 6.2.4 → 7.2.0

Left at current (blocked by deps chain):
  eslint / @eslint/js — typescript-eslint needs eslint 10 support
  typescript — typescript-eslint needs TS 7 support

Added CI TODO note for when vite-plugin-svelte-inspector catches up.
2026-07-10 20:03:41 +01:00
popertots 895d7f0df9 chore: update shadcn-svelte from 1.4.0 to 1.4.1
CI / Docker compose check (push) Successful in 26s
CI / Env docs check (push) Successful in 27s
CI / Frontend major deps (push) Failing after 54s
CI / Secrets scan (push) Successful in 55s
CI / Go build (push) Successful in 55s
CI / Frontend deps check (push) Successful in 55s
CI / Nginx config check (push) Successful in 1m0s
CI / Frontend build (push) Successful in 1m1s
CI / go mod tidy (push) Successful in 38s
CI / Go vet (dev) (push) Successful in 1m49s
CI / Go vet (prod) (push) Successful in 2m26s
CI / Go vulnerabilities (push) Successful in 1m41s
CI / Knip (push) Successful in 56s
CI / Staticcheck (prod) (push) Failing after 2m46s
CI / golangci-lint (push) Successful in 4m24s
CI / Staticcheck (dev) (push) Failing after 4m22s
CI / Frontend a11y check (push) Failing after 2m11s
CI / Security scan (prod) (push) Failing after 4m31s
CI / Security scan (dev) (push) Failing after 4m37s
CI / Tests (prod) (push) Has been skipped
CI / Tests (dev) (push) Has been skipped
CI / Race (prod) (push) Has been skipped
CI / Race (dev) (push) Has been skipped
CI / Frontend QC (audit) (push) Successful in 1m58s
CI / Frontend QC (typecheck) (push) Successful in 2m10s
CI / Frontend QC (lint) (push) Successful in 2m26s
CI / Svelte strict check (push) Successful in 26s
2026-07-10 11:20:35 +01:00
popertotsandSisyphus 407de74b51 fix: restore test-used functions, silence tx.Rollback closed errors, prune knip dead code
CI / Frontend deps check (push) Successful in 22s
CI / Go vulnerabilities (push) Successful in 32s
CI / Go build (push) Successful in 32s
CI / go mod tidy (push) Successful in 13s
CI / Knip (push) Failing after 33s
CI / Frontend build (push) Successful in 1m12s
CI / Svelte strict check (push) Has been skipped
CI / Frontend QC (audit) (push) Has been skipped
CI / Frontend QC (typecheck) (push) Has been skipped
CI / Frontend QC (lint) (push) Has been skipped
CI / Go vet (push) Successful in 57s
CI / golangci-lint (push) Successful in 1m8s
CI / Tests (prod) (push) Successful in 1m45s
CI / Tests (dev) (push) Successful in 2m5s
CI / Race (prod) (push) Successful in 3m27s
CI / Race (dev) (push) Successful in 4m52s
Restore processImage (images.go) and nonDepositPaymentType (handlers.go) with //nolint:unused — used in test files.
Fix 97 tx.Rollback defers to silently discard expected "tx is closed" error after commit.
Frontend: remove 44 unused shadcn-svelte files, 2 dead components, 9 stale npm deps, prune unused exports.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-09 19:20:25 +01:00
popertotsandSisyphus 96410c9f18 chore: remove minimatch override (no longer needed), keep cookie override (SvelteKit pinned dep)
CI / Go vulnerabilities (push) Successful in 57s
CI / Build & Vet (push) Successful in 1m14s
CI / Frontend build (gate) (push) Successful in 1m2s
CI / Tests (prod) (push) Has been cancelled
CI / Tests (dev) (push) Has been cancelled
CI / Race (prod) (push) Has been cancelled
CI / Race (dev) (push) Has been cancelled
CI / Frontend QC (audit) (push) Has been cancelled
CI / Frontend QC (typecheck) (push) Has been cancelled
CI / Frontend QC (lint) (push) Has been cancelled
npm update resolved minimatch transitively. cookie still pinned via override because SvelteKit <= 2.69.2 depends on vulnerable cookie < 0.7.0.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-09 17:44:34 +01:00
popertotsandSisyphus 914f9993ec ci: remove test/race timeouts, add concurrency cancel-in-progress, fix npm audit vulns
CI / Go vulnerabilities (push) Successful in 35s
CI / Build & Vet (push) Successful in 49s
CI / Frontend build (gate) (push) Successful in 57s
CI / Tests (prod) (push) Has been cancelled
CI / Tests (dev) (push) Has been cancelled
CI / Race (prod) (push) Has been cancelled
CI / Race (dev) (push) Has been cancelled
CI / Frontend QC (audit) (push) Has been cancelled
CI / Frontend QC (typecheck) (push) Has been cancelled
CI / Frontend QC (lint) (push) Has been cancelled
- Remove -timeout 180s/240s from go test and race commands
- Add concurrency group to cancel stale pipelines on new pushes
- Run npm update to bump Vite 7.3.5 -> 7.3.6, fixing nested esbuild vuln
- npm audit now at 0 vulnerabilities

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-07-09 17:43:13 +01:00
popertots 00c06ca79a ci: commit frontend package-lock.json for reproducible CI builds
Backend CI / Tests (push) Successful in 59s
Backend CI / Race detector (push) Failing after 22s
Backend CI / Lint & vulns (push) Failing after 52s
package-lock.json was gitignored, so CI checkouts didn't have it and
npm ci failed. Removing from .gitignore so it's tracked and CI can
install dependencies deterministically.
2026-06-25 13:07:20 +01:00