Commit Graph

209 Commits

Author SHA1 Message Date
Sase Dev
492780d001 fix(csp): allow data: media for Remotion player audio
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 10:29:25 +00:00
Fusion
36d041d514 fix(csp,faro): allow t.sase.tr in CSP and proxy /collect/ to Grafana Cloud
CSP was blocking PostHog scripts/connections (t.sase.tr) and the theme-FOUC
inline script in index.html. Faro /collect/ requests were aborting because
the bare-metal nginx route disappeared during the Coolify migration.

- Add https://t.sase.tr to scriptSrc + connectSrc
- Add sha256 hash for the theme-FOUC inline script in index.html
- Exclude /collect/* from the /api global prefix
- Add FaroCollectController that forwards POST /collect/:id to
  faro-collector-prod-eu-west-2.grafana.net (overridable via FARO_UPSTREAM)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 10:08:18 +00:00
Fusion
5bd5325367 feat(FN-356): add checkout_started PostHog event to subscription checkout flow (+1 more)
Commits merged:
- chore(FN-356): verify checkout_started event is in place
- feat(FN-356): add checkout_started PostHog event to subscription checkout flow

Files changed:
apps/web/src/routes/dashboard/subscription/index.tsx | 4 ++++
 1 file changed, 4 insertions(+)

Fusion-Task-Id: FN-356
2026-05-14 10:00:40 +00:00
Fusion
69d07fc488 docs(readme): spacing tweak — measure cache-enabled dev deploy speed
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 09:34:17 +00:00
Fusion
97b2973eee docs(readme): add staging URL — gitea deploy flow smoke test
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 08:56:28 +00:00
Fusion
12bc1228b9 ci: drop deploy.yml + sync-dev-to-gitea.yml — pipeline now Gitea-only
Some checks failed
QA Gate (P0/P1) / Test affected app (pull_request) Has been cancelled
Gitea (git.semih.ai) is the canonical remote. Coolify pulls from Gitea
and triggers builds via Gitea webhooks. Deployment notifications come
from Coolify's built-in Telegram integration (team-level, configured
2026-05-14).

What used to be done by GH Actions:
- deploy.yml (push main → SSH → PM2 → bare-metal sase.tr)
- sync-dev-to-gitea.yml (mirror github/dev → gitea/dev)

What replaces it:
- Push to gitea/main → Coolify webhook → sparkling-snake (production env, prod-iskelet ready)
- Push to gitea/dev  → Coolify webhook → good-gerenuk (staging env, dev.sase.tr)
- Both deploys notified via Coolify → Telegram (chat 7840804807)

qa-gate.yml retained for now (PR test gating); will revisit when Gitea
Actions / Drone are wired or removed if obsolete.
2026-05-14 07:47:52 +00:00
Fusion
3267984395 ci: Telegram notify on prod deploy + dev→Gitea sync (success/fail with commit info)
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
2026-05-14 06:38:12 +00:00
Fusion
cd24444f66 docs(audit): mark sections 4/5/9 as shipped to stop Designer dupes
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
The post-P0 subscription audit listed Sections 4 (trust copy aria-labels),
5 (payment badge SVGs), and 9 (cancel-save dialog width) as outstanding
P1 polish items. All three have shipped to dev:
- Section 4 → FN-294 / 7036b18
- Section 5 → FN-296 / e5201b2
- Section 9 → 1dfeb13 (manual; FN-291/295 attempts both failed/duplicated)

Designer's heartbeat kept reading the stale status table and re-spawning
duplicate tasks (FN-291 → FN-296 → FN-326 chain for Section 5 alone).
Mark them DONE with commit refs and add an explicit "do not create new
tasks" note so heartbeats stop looping on it.
2026-05-14 06:36:24 +00:00
Fusion
2e30d2abbc chore(scope): enforce Fusion-ships-to-dev-only rule; remove prod-targeted e2e cruft
Fusion is allowed to ship to dev.sase.tr (staging) only — the user owns
the dev→main GitHub merge that promotes to production. Heartbeat-created
tasks kept hallucinating prod deploys / monitoring (FN-291 / 315 / 323 /
324 / 311 etc.), and an entire e2e suite targeting live sase.tr was merged
under FN-320 with hardcoded test creds.

Changes:
- Add "Project-wide rule: Fusion ships to dev.sase.tr only" block to all
  7 agent personas (ceo/cto/cpo/designer/qa/backend-eng/frontend-eng).
- Add /AGENTS.md at project root as the canonical rule (loaded once
  pi-markdown-workflows is reinstalled in the container).
- Remove production-targeted e2e suite under apps/web/e2e/ (auth.setup.ts,
  deployment-audit.cjs, p0-subscription-cro.spec.ts, p0-subscription-cro-verify.cjs,
  playwright.config.ts, screenshots/).
- Remove docs/product/funnel-monitoring-p0-cro-post-deploy-2026-05.md
  (prod-monitoring deliverable, out-of-scope).
- Subscription downgrade-offer dialog: avoid mobile-viewport overflow by
  capping width at calc(100vw - 2rem) below sm breakpoint
  (formerly attempted in failed/duplicate FN-291/295).
2026-05-14 06:36:24 +00:00
Fusion
2ba2a2703c feat(FN-350): cleanup — FN-344 and FN-347 already absent from board
Commits merged:
- chore(FN-350): cleanup — FN-344 and FN-347 already absent from board

Files changed:
pnpm-lock.yaml | 71 +++++++++-------------------------------------------------
 1 file changed, 10 insertions(+), 61 deletions(-)

Fusion-Task-Id: FN-350

Fusion-Task-Lineage: 43d43125-cdac-4ab3-8b8e-d709ef190c7d
2026-05-14 05:23:27 +00:00
Fusion
cc251d207b fix(FN-349): exclude spec files from tsc build
Fusion-Task-Id: FN-349
Fusion-Task-Lineage: 6221f636-1ede-4ebb-b8b2-b3abb3b252c3
2026-05-14 05:21:21 +00:00
Fusion
1039812a8f feat(FN-349): add vitest tests for @sase/config and @sase/shared packages
Fusion-Task-Id: FN-349
Fusion-Task-Lineage: 6221f636-1ede-4ebb-b8b2-b3abb3b252c3
2026-05-14 05:21:21 +00:00
Fusion
906eef148d feat(FN-346): add CLS regression test for skeleton plan grid (+1 more)
Commits merged:
- feat(FN-346): add grid-parity integration test for skeleton CLS regression
- feat(FN-346): add CLS regression test for skeleton plan grid

Files changed:
.../subscription/__tests__/cls-regression.test.tsx | 128 +++++++++++++++++++
 .../subscription/__tests__/grid-parity.test.tsx    | 141 +++++++++++++++++++++
 .../src/routes/dashboard/subscription/index.tsx    |   4 +-
 3 files changed, 271 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-346
2026-05-14 05:09:47 +00:00
Fusion
5333ef44c7 feat(FN-348): verification script, API checks, and report
Commits merged:
- feat(FN-348): complete Step 1 — verification script, API checks, and report

Files changed:
qa/post-deploy/fn348-verify.mjs | 548 ++++++++++++++++++++++++++++++++++++++++
 qa/post-deploy/report.md        | 171 +++++++++++++
 qa/post-deploy/results.json     | 146 +++++++++++
 3 files changed, 865 insertions(+)

Fusion-Task-Id: FN-348
2026-05-14 04:30:23 +00:00
Fusion
aaf2e763cb feat(FN-345): fix skeleton layout shift, dialog overflow, and safe-area padding (+1 more)
Commits merged:
- fix(FN-345): add mobile-safe max-width to cancel confirm dialog
- fix(FN-345): fix skeleton layout shift, dialog overflow, and safe-area padding

Files changed:
apps/web/src/routes/dashboard/subscription/index.tsx | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

Fusion-Task-Id: FN-345
2026-05-14 03:05:45 +00:00
Fusion
561b02b3d2 feat(FN-343): remove lingering iyzico references after Stripe migration (+1 more)
Commits merged:
- chore(FN-343): remove lingering iyzico references from docs, config, and scripts
- feat(FN-343): remove lingering iyzico references after Stripe migration

Files changed:
CLAUDE.md                                    | 10 +++++-----
 README.md                                    |  2 +-
 apps/api/src/database/schema/core.ts         |  1 +
 apps/web/src/messages/en.json                |  1 -
 apps/web/src/messages/tr.json                |  1 -
 apps/web/src/routes/dashboard/billing.tsx    |  6 +++---
 docker-compose.coolify.yml                   |  5 ++---
 docs/INDEX.md                                | 27 ++++++++++++-------------
 knowledge.md                                 | 30 ++++++++++++++--------------
 packages/shared/src/constants/error-codes.ts |  1 -
 packages/shared/src/index.ts                 |  1 -
 packages/shared/src/types/payment.ts         | 12 +----------
 scripts/fn342-pw-verify.mjs                  |  2 +-
 scripts/validate-env.sh                      |  3 +--
 14 files changed, 43 insertions(+), 59 deletions(-)

Fusion-Task-Id: FN-343
2026-05-14 02:31:42 +00:00
Fusion
c1085d0bbf feat(FN-342): add Playwright visual verification script for P0 subscription CRO fixes (+1 more)
Commits merged:
- feat(FN-342): finalize production verification — all P0 CRO fixes confirmed live
- feat(FN-342): add Playwright visual verification script for P0 subscription CRO fixes

Files changed:
scripts/fn342-pw-verify.mjs | 416 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 416 insertions(+)

Fusion-Task-Id: FN-342
2026-05-14 01:29:02 +00:00
Fusion
dc63dac838 feat(FN-335): log coordination check-in — confirmed human-blocked at Step 1
Commits merged:
- chore(FN-335): log coordination check-in — confirmed human-blocked at Step 1

Files changed:
docs/product/funnel-audit-p0-cro-2026-05.md | 1 +
 1 file changed, 1 insertion(+)

Fusion-Task-Id: FN-335
2026-05-14 00:02:18 +00:00
Sase Dev
02bf7342a1 fix(subscription): recover stepper when a pending checkout is abandoned
Some checks failed
Deploy / Deploy to Production (push) Has been cancelled
A user who picked a plan + brands, clicked the checkout button to
create the pending subscription, then closed the tab without paying
came back to a frozen "Mevcut Plan · Bekliyor" card with no payment
button and no way to edit. Status was "pending", which my conditional
treated as an active subscription and routed away from the stepper.

Frontend
- hasActiveSub narrowed to active|cancelled only. Pending users now
  see the stepper again.
- New effect pre-fills selectedPlanKey, selectedBrandIds,
  billingPeriod from the pending row on first render and jumps
  straight to the payment step.
- New PendingPaymentBanner at the top of the stepper with
  "Odemeye devam et" (scrolls + sets step=payment) and "Vazgec"
  (calls cancel-pending then resets selection).

Backend
- subscriptions.service.create() auto-expires existing pending
  rows for the user before inserting a new one — abandoned checkouts
  no longer accumulate and a fresh attempt with a different plan
  doesn't 409.
- New PATCH /subscriptions/cancel-pending + service method for
  the banner's explicit cancel action.

i18n: subscription.pendingBanner.* (tr/en).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 22:57:13 +00:00
Sase Dev
9c05a05a7a fix(drizzle): register 0004_hot_quicksilver in migration journal
The 0004 migration file shipped in 6a0b36a but _journal.json did not
include its entry, so the hash-based migrate runner saw "0 applied,
4 already applied" on the previous deploy. Append idx 4 so the next
deploy picks it up.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 22:46:54 +00:00
Sase Dev
6a0b36a7a0 feat: replace Iyzico with Stripe + single-page subscription stepper
Subscription/checkout flow rewritten end-to-end. The plan-card "Devam Et"
button silently wiped brand selection on re-click and the actual proceed
button lived offscreen — fixed by collapsing plan/brands/payment/confirm
into a single vertical stepper with one sticky CTA.

Backend
- Stripe Hosted Checkout (`/payments/stripe/checkout`) + webhook
  (`/payments/stripe/webhook`, raw body) replacing the stubbed Iyzico
  module. Webhook activates subscription on `checkout.session.completed`,
  expires the pending subscription on cancel/expire so users can retry.
- New `bank_accounts` table — multiple rows, single `is_active` enforced
  by a partial unique index. Admin CRUD under `/admin/bank-accounts`
  with multipart QR upload to MinIO; atomic `/activate` swap in a
  transaction; `GET /payments/bank-info` returns the active row.
- `payments` gains `stripe_session_id`, `stripe_payment_intent_id`,
  `bank_account_id`. EFT flow now reads the active bank account at
  payment time and stores the FK for reconciliation.
- Env: `IYZICO_*` removed, `STRIPE_*` added (validated by zod schema).
- `main.ts` `rawBody: true` for Stripe signature verification.
- Drizzle 0003 snapshot id collision fixed (VIEW-only migration shared
  prevId with 0002, blocking new generates).

Frontend
- `/dashboard/subscription` rewritten as a 4-step vertical stepper with
  step-aware sticky bottom CTA; plan re-selection is idempotent and
  preserves brand state. `/dashboard/subscription/pay` deleted; Stripe
  returns to the same page via `?stripe=success|cancelled` and the UI
  polls `/subscriptions/me` until the webhook activates the row.
- New components: `bank-transfer-card.tsx` (DB-driven IBAN + Kolay Adres
  + uploaded QR image + receipt upload) and `stripe-checkout-button.tsx`.
- Active subscription view, trial onboarding/urgency banner, downgrade
  and cancel dialogs preserved.
- TR/EN i18n: new `subscription.steps.*`, `subscription.stickyCta.*`,
  `payment.stripe.*`, `payment.bank.*`; provider label updated.

PostHog: `method: "iyzico"` → `"stripe"`; new events `iban_copied`,
`kolay_adres_copied`, `qr_viewed`, `eft_initiated`,
`stripe_redirect_returned`.

Deploy runs `db:migrate` which applies 0004_hot_quicksilver
(additive: new table + nullable columns; safe to apply on prod).
Operator must add `STRIPE_SECRET_KEY`, `STRIPE_PUBLISHABLE_KEY`,
`STRIPE_WEBHOOK_SECRET` to env and create the first
`bank_accounts` row via the admin endpoint before the bank tab works.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 22:42:28 +00:00
Sase Dev
0b6d4bb0a7 feat(analytics): enrich PostHog VIN/parts/subscription events (SASE-PH-001 Faz 0/1 additive subset)
Per sase-posthog-events-prd.md, additive-only pass (no renames, no dead-feature events):

- search.tsx: add search_input_focused, search_input_validation_failed,
  search_paste_detected, search_history_item_selected; track query_source
  (manual|paste|history) and propagate to vin_decoded/success/error; add
  response_time_ms, source, status_code on success/error; add selected_index,
  candidates_count, time_to_select_ms to vin_decode_candidate_selected.
- parts-panel.tsx: add parts_panel_viewed with vehicle_id, category_id,
  parts_count, has_prices, available_groups_count (one-shot per mount).
- subscription/index.tsx: enrich plan_selected (period, from_plan, status),
  checkout_started (from_plan, brands_count, trial_available, status),
  subscription_cancelled (from_plan, billing_period, status_before_cancel,
  days_since_start, had_downgrade_offer).
2026-05-13 22:05:50 +00:00
Sase Dev
5b9af5a6a5 fix(web): hoist hooks above early returns in TrialUrgencyBanner
useEffect and useCallback were declared after three `return null` guards,
so when a user's subscription transitioned into the trial+≤7-days window
React saw more hooks than the previous render and crashed with #310.
Hoisted all hooks above the single guard return; render and dismiss
behavior unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 21:41:16 +00:00
Fusion
98e6ac815e chore: trigger redeploy for P0 subscription CRO fixes (FN-298) 2026-05-13 11:34:23 +00:00
Fusion
c8aac14d56 feat(FN-306): change trial banner threshold to ≤7 days and rename PostHog events
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Deploy / Deploy to Production (push) Has been cancelled
Commits merged:
- feat(FN-306): complete Step 1 — change trial banner threshold to ≤7 days and rename PostHog events

Files changed:
apps/web/src/components/trial-urgency-banner.tsx | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-306
2026-05-13 09:00:22 +00:00
Fusion
6c3243fdb0 feat(FN-299): confirm fn_review_spec root cause — probabilistic model behavior, not code-path bug
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- docs(FN-299): confirm fn_review_spec root cause — probabilistic model behavior, not code-path bug

Files changed:
.fusion/memory/MEMORY.md | 30 +++++++++++++++++++++++++-----
 1 file changed, 25 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-299
2026-05-13 08:17:41 +00:00
Fusion
746c7e552c fix(ci): qa-gate — remove duplicate pnpm version pin
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
pnpm/action-setup@v4 conflicts when both workflow `version: 10` and
package.json `"packageManager": "pnpm@10.29.3"` are set. Drop the
workflow pin and let action-setup read packageManager.

Unblocks the QA gate workflow on PRs (was failing in setup before
tests ran, e.g. run 25784218896).
2026-05-13 08:15:11 +00:00
Fusion
4cb715f1b4 feat(FN-300): add trial urgency banner to subscription page
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-300): complete Step 1 — add trial urgency banner to subscription page

Files changed:
.../src/routes/dashboard/subscription/index.tsx    | 107 +++++++++++++++++++++
 1 file changed, 107 insertions(+)

Fusion-Task-Id: FN-300
2026-05-13 08:13:26 +00:00
Fusion
3dd4dc2f77 feat(FN-297): add social proof impression tracking to landing page testimonials (+2 more)
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- docs(FN-297): update FN-275 audit with social proof event locations
- fix(FN-297): format IntersectionObserver mock in test file
- feat(FN-297): add social proof impression tracking to landing page testimonials

Files changed:
apps/web/src/routes/__tests__/index.test.tsx |   7 ++
 apps/web/src/routes/index.tsx                | 111 +++++++++++++++++++++++++--
 docs/product/funnel-audit-p1-cro-2026-05.md  |  19 ++++-
 3 files changed, 127 insertions(+), 10 deletions(-)

Fusion-Task-Id: FN-297
2026-05-13 07:28:34 +00:00
Fusion
80596a4ceb feat(FN-285): fix EMEX parallel decode race — always await second promise
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- fix(FN-285): fix EMEX parallel decode race — always await second promise

Files changed:
apps/api/src/vehicles/vehicles.service.spec.ts | 63 ++++++++++++++++++++++++++
 apps/api/src/vehicles/vehicles.service.ts      |  5 +-
 2 files changed, 66 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-285
2026-05-13 06:56:18 +00:00
Fusion
b0edb079d9 feat(FN-284): document verified QA gate fail→fix→pass cycle
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- docs(FN-284): document verified QA gate fail→fix→pass cycle

Files changed:
.fusion/memory/MEMORY.md | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

Fusion-Task-Id: FN-284
2026-05-13 06:45:58 +00:00
Fusion
6162a8f787 feat(FN-283): add PostHog events to TrialUrgencyBanner
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-283): add PostHog events to TrialUrgencyBanner

Files changed:
apps/web/src/components/trial-urgency-banner.tsx | 34 ++++++++++++++++++++++--
 1 file changed, 32 insertions(+), 2 deletions(-)

Fusion-Task-Id: FN-283
2026-05-13 06:41:04 +00:00
Fusion
c0fef5921b feat(FN-282): add social proof impression tracking to testimonial and trust components
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-282): add social proof impression tracking to testimonial and trust components

Files changed:
apps/web/src/routes/_auth.tsx                      | 42 +++++++++++-
 .../src/routes/dashboard/subscription/index.tsx    | 80 ++++++++++++++++++++--
 2 files changed, 117 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-282
2026-05-13 06:36:16 +00:00
Fusion
d855b564bf feat(FN-281): add payment_success and payment_failed PostHog events (+1 more)
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- fix(FN-281): make result search param truly optional to fix typecheck
- feat(FN-281): add payment_success and payment_failed PostHog events

Files changed:
apps/api/package.json                              |    1 +
 apps/api/src/app.module.ts                         |    2 +
 apps/api/src/payments/payments.service.spec.ts     |   99 +-
 apps/api/src/payments/payments.service.ts          |   40 +
 apps/api/src/posthog/posthog.module.ts             |    9 +
 apps/api/src/posthog/posthog.service.ts            |   64 ++
 .../web/src/components/payment/payment-content.tsx |   24 +-
 apps/web/src/routeTree.gen.ts                      | 1110 ++++++++++----------
 apps/web/src/routes/dashboard/subscription/pay.tsx |   24 +-
 packages/config/src/index.ts                       |    4 +
 pnpm-lock.yaml                                     |   30 +
 11 files changed, 827 insertions(+), 580 deletions(-)

Fusion-Task-Id: FN-281
2026-05-13 06:30:58 +00:00
Fusion
7707443be6 feat(FN-278): add yearly_toggle_clicked PostHog events and 4-col skeleton grid
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
- Track yearly_toggle_clicked PostHog event on billing period toggle (monthly/yearly)
- Update skeleton grid from 2-col to 4-col layout with additional skeleton cards
- Add regression tests verifying analytics tracking and skeleton grid rendering

Fusion-Task-Id: FN-278
2026-05-13 05:55:25 +00:00
Fusion
a526cecc40 feat(FN-266): write post-P0 subscription UX audit deliverable
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-266): write post-P0 subscription UX audit deliverable

Files changed:
docs/design-specs/post-p0-subscription-audit.md | 351 ++++++++++++++++++++++++
 1 file changed, 351 insertions(+)

Fusion-Task-Id: FN-266
2026-05-13 05:47:38 +00:00
Fusion
cc2bfbe2b0 feat(FN-211): normalize typography on subscription page
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- fix(FN-211): normalize typography on subscription page

Files changed:
apps/web/src/routes/dashboard/subscription/index.tsx | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

Fusion-Task-Id: FN-211
2026-05-13 05:30:19 +00:00
Fusion
fa49c20d09 feat(FN-263): normalize typography on subscription page (+2 more)
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-263): normalize typography on subscription page
- chore(FN-263): apply Biome formatting fix for long className lines
- feat(FN-263): normalize typography on subscription page

Files changed:
.../src/routes/dashboard/subscription/index.tsx    | 116 +++++++++++----------
 1 file changed, 62 insertions(+), 54 deletions(-)

Fusion-Task-Id: FN-263
2026-05-13 04:51:56 +00:00
Fusion
f0bfe6ec8b feat(FN-280): add cancel-save flow PostHog events — cancel_flow_viewed and cancel_save_clicked
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-280): add cancel-save flow PostHog events — cancel_flow_viewed and cancel_save_clicked

Files changed:
apps/web/src/routes/dashboard/subscription/index.tsx | 17 ++++++++++++++++-
 1 file changed, 16 insertions(+), 1 deletion(-)

Fusion-Task-Id: FN-280
2026-05-13 03:58:39 +00:00
Fusion
fb3fa6dff4 feat(FN-277): add @sase/shared resolve alias to vitest configs for both api and web (+1 more)
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- docs(FN-277): update Pre-Merge QA Gate policy with explicit sub-bullets per spec
- fix(FN-277): add @sase/shared resolve alias to vitest configs for both api and web

Files changed:
.fusion/memory/MEMORY.md  | 14 +++++++++-----
 apps/api/vitest.config.ts |  6 ++++++
 apps/web/vitest.config.ts |  1 +
 3 files changed, 16 insertions(+), 5 deletions(-)

Fusion-Task-Id: FN-277
2026-05-13 02:07:02 +00:00
Fusion
d985e771d1 feat(FN-275): deliver PostHog funnel audit — P1 CRO sprint instrumentation gap report
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- docs(FN-275): deliver PostHog funnel audit — P1 CRO sprint instrumentation gap report

Files changed:
docs/product/funnel-audit-p1-cro-2026-05.md | 231 ++++++++++++++++++++++++++++
 1 file changed, 231 insertions(+)

Fusion-Task-Id: FN-275
2026-05-13 02:02:56 +00:00
Fusion
6ae26e7a62 feat(FN-213): a11y audit — fix plan card double-focus trap, trust bar ARIA, color contrast
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-213): a11y audit — fix plan card double-focus trap, trust bar ARIA, color contrast

Files changed:
apps/web/src/routes/dashboard/subscription/__tests__/index.test.tsx | 1 +
 1 file changed, 1 insertion(+)

Fusion-Task-Id: FN-213
2026-05-13 01:54:30 +00:00
Fusion
1eea1485e9 feat(FN-274): add fix-patterns for fn_review_spec pipeline failure
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-274): complete Step 1 — add fix-patterns for fn_review_spec pipeline failure

Files changed:
.fusion/memory/MEMORY.md | 12 ++++++++++++
 1 file changed, 12 insertions(+)

Fusion-Task-Id: FN-274
2026-05-13 01:23:19 +00:00
Fusion
e94c1e4267 feat(FN-271): implement a11y fixes (plan card focus, trust bar ARIA, color contrast)
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-271): complete Step 1 — implement a11y fixes (plan card focus, trust bar ARIA, color contrast)

Files changed:
.../subscription/__tests__/index.test.tsx          | 87 ++++++++++++--------
 .../src/routes/dashboard/subscription/index.tsx    | 94 ++++++++++++++++++----
 2 files changed, 133 insertions(+), 48 deletions(-)

Fusion-Task-Id: FN-271
2026-05-13 00:32:58 +00:00
Fusion
f9460d2dd4 feat(FN-269): CI QA gate workflow + memory policy
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-269): complete Step 1 — CI QA gate workflow + memory policy

Files changed:
.fusion/memory/MEMORY.md      | 10 ++++++++
 .github/workflows/qa-gate.yml | 58 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

Fusion-Task-Id: FN-269
2026-05-12 23:01:20 +00:00
Fusion
03e401b133 feat(FN-217): lazy-load canvas-confetti via dynamic import to avoid bloating subscription bundle (+2 more)
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- fix(FN-217): fix import sort order (lint)
- fix(FN-217): convert @sase/shared to emit ESM for Vite/Rollup build compatibility
- fix(FN-217): lazy-load canvas-confetti via dynamic import to avoid bloating subscription bundle

Files changed:
apps/web/src/routes/dashboard/subscription/index.tsx | 13 +++++++------
 apps/web/src/routes/pricing.tsx                      |  2 +-
 packages/shared/package.json                         |  5 +++--
 packages/shared/tsconfig.json                        |  4 ++--
 4 files changed, 13 insertions(+), 11 deletions(-)

Fusion-Task-Id: FN-217
2026-05-12 22:57:32 +00:00
Fusion
3dfd0de0c6 feat(FN-216): simplify plan card click handler — remove duplicate Button.onClick
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- fix(FN-216): simplify plan card click handler — remove duplicate Button.onClick

Files changed:
apps/web/src/routes/dashboard/subscription/index.tsx | 4 ----
 1 file changed, 4 deletions(-)

Fusion-Task-Id: FN-216
2026-05-12 22:31:53 +00:00
Fusion
479000d4a1 feat(FN-215): use shared formatTRY singleton instead of per-call Intl.NumberFormat
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- perf(FN-215): use shared formatTRY singleton instead of per-call Intl.NumberFormat

Files changed:
apps/web/src/components/payment/payment-content.tsx  |  9 +--------
 apps/web/src/routes/dashboard/admin/index.tsx        | 11 ++---------
 apps/web/src/routes/dashboard/admin/payments.tsx     | 11 ++---------
 apps/web/src/routes/dashboard/admin/users.tsx        | 11 ++---------
 apps/web/src/routes/dashboard/billing.tsx            |  9 ++-------
 apps/web/src/routes/dashboard/subscription/index.tsx | 10 +---------
 apps/web/src/routes/pricing.tsx                      | 10 +---------
 7 files changed, 11 insertions(+), 60 deletions(-)

Fusion-Task-Id: FN-215
2026-05-12 22:28:23 +00:00
Fusion
e97aab6fe4 feat(FN-214): extract brandLimit 999 magic number to FULL_PLAN_BRAND_LIMIT constant in @sase/shared (+1 more)
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- fix(FN-214): add missing import for FULL_PLAN_BRAND_LIMIT in subscription/index.tsx
- feat(FN-214): extract brandLimit 999 magic number to FULL_PLAN_BRAND_LIMIT constant in @sase/shared

Files changed:
apps/web/src/routes/dashboard/subscription/index.tsx | 16 +++++++++++-----
 apps/web/src/routes/pricing.tsx                      |  3 ++-
 packages/shared/src/constants/plans.ts               |  3 +++
 packages/shared/src/index.ts                         |  2 +-
 4 files changed, 17 insertions(+), 7 deletions(-)

Fusion-Task-Id: FN-214
2026-05-12 22:21:14 +00:00
Fusion
1a90641529 feat(FN-210): add compact testimonials strip below trust bar on landing page
Some checks failed
Sync dev → Gitea / Mirror dev to Gitea (push) Has been cancelled
Commits merged:
- feat(FN-210): add compact testimonials strip below trust bar on landing page

Files changed:
apps/web/src/routes/index.tsx | 55 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)

Fusion-Task-Id: FN-210
2026-05-12 22:12:23 +00:00