Skip to content

feat(proposals): public interactive proposal acceptance page (TASK-0062) - #75

Merged
Ediminator merged 4 commits into
mainfrom
feat/task-0062-public-interactive-proposal-acceptance-p
Nov 4, 2026
Merged

Ediminator merged 4 commits into
mainfrom
feat/task-0062-public-interactive-proposal-acceptance-p

Conversation

@Ediminator

Copy link
Copy Markdown
Owner

Summary

Implements TASK-0062: Public interactive proposal client acceptance page (/p/[token] and /[locale]/p/[token]), acceptProposalAction, and CI test date determinism fix.

  • Middleware & Cookieless Protection (src/middleware.ts): Added 'p' to PUBLIC_PATH_SEGMENTS, stripped all set-cookie headers on /p/** and /[locale]/p/** responses (TDDDG §25 / GDPR Art. 5), and enforced X-Robots-Tag: noindex, nofollow, noarchive.
  • Public Proposal Page (src/app/[locale]/p/[token]/page.tsx, src/app/p/[token]/page.tsx): Added public proposal route with SHA-256 token lookup, atomic fail-closed rate limiting (30 req/min per IP via consumeProposalRateLimit), reactive optional add-on toggles and quantity controls (PublicProposalView), AcceptProposalModal, and active/expired/revoked/accepted lifecycle views.
  • Serializable Acceptance Ceremony (src/server/proposals/public-actions.ts): Implemented acceptProposalAction in a PostgreSQL serializable transaction that recomputes totals server-side, freezes accepted_options_snapshot, masks client IPs (/24 IPv4, /48 IPv6), updates projects.price_minor and projects.currency, auto-transitions project stage from 'inquiry' to 'booked', emits timeline and audit events, and enqueues proposal_accepted_client and proposal_accepted_owner outbox emails.
  • CI Test Date Determinism Fix (AC-9): Passed explicit now: new Date('2026-11-01T00:00:00Z') to calculateAvailableSlots in tests/integration/google-calendar-outbound-sync.test.ts and used a future-relative date in tests/e2e/availability-settings.spec.ts.

Validation

  • Quality Gate (--profile full): 13/13 steps PASS on c09cc30e70cc (unit/integration coverage: 90.78% statements, 85.61% branches, 87.30% functions, 91.10% lines; 220/220 Playwright E2E tests).
  • Independent Reviews: validator (PASS, 0 blocking), security-privacy-auditor (PASS, 0 blocking), and ux-a11y-reviewer (PASS, 0 blocking) in iteration 1.

…K-0062)

Signed-off-by: Ediminator <211899731+Ediminator@users.noreply.github.com>
…oute (TASK-0062)

Signed-off-by: Ediminator <211899731+Ediminator@users.noreply.github.com>
…lowlist (TASK-0062)

Signed-off-by: Ediminator <211899731+Ediminator@users.noreply.github.com>
…ater (TASK-0062)

Signed-off-by: Ediminator <211899731+Ediminator@users.noreply.github.com>
@Ediminator
Ediminator merged commit 66a76ff into main Nov 4, 2026
8 checks passed
@Ediminator
Ediminator deleted the feat/task-0062-public-interactive-proposal-acceptance-p branch November 4, 2026 07:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant