feat(FN-395): P1 candidate shortlist 2026-05-15 (CEO deliverable)
Commits merged: - docs(FN-395): P1 candidate shortlist 2026-05-15 (CEO deliverable) Files changed: docs/product/p1-shortlist-2026-05-15.md | 82 +++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) Fusion-Task-Id: FN-395
This commit is contained in:
82
docs/product/p1-shortlist-2026-05-15.md
Normal file
82
docs/product/p1-shortlist-2026-05-15.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# P1 Candidate Shortlist — 2026-05-15 (CEO deliverable, FN-395)
|
||||
|
||||
**Author:** Fusion executor (FN-395)
|
||||
**Locked scoring model:** CEO-approved 2026-05-15 — see [Scoring model](#scoring-model) below. Not redefined here.
|
||||
**Baseline (frozen):** FN-368 (parts-panel rage-click fix, shipped 2026-05-14, dev → main). PostHog instrumentation status snapshot used for scoring is the pair of audit docs frozen on 2026-05-13:
|
||||
- `docs/product/funnel-audit-p0-cro-2026-05.md`
|
||||
- `docs/product/funnel-audit-p1-cro-2026-05.md`
|
||||
|
||||
Both are tracked artifacts in this repo; no live PostHog query links are referenced for this shortlist (per constraint — drift kills post-merge comparison). Session-count buckets below are ordinal estimates anchored to that frozen snapshot, not new dashboard queries.
|
||||
|
||||
---
|
||||
|
||||
## Scoring model (locked, do not redefine)
|
||||
|
||||
```
|
||||
Impact = sessions × funnel_position_weight × revenue_weight
|
||||
```
|
||||
|
||||
| Knob | Values | Notes |
|
||||
|------|--------|-------|
|
||||
| sessions | H=3, M=2, L=1 | Ordinal bucket from frozen baseline (last 30d) |
|
||||
| funnel_position_weight | top=1, mid=2, bottom=3 | Bottom = checkout / payment / receipt |
|
||||
| revenue_weight | standard=1, **high=2** | High = quote-submit and checkout flows |
|
||||
| Tiebreaker | **Fixability confidence**: H > M > L | Applied only when scores tie |
|
||||
| Research gate | If `Intervention known? = N` AND impact is high → **research task, not a P1** | Excluded from shortlist; logged in sidebar |
|
||||
|
||||
---
|
||||
|
||||
## Shortlist (5 rows: winners + rejected)
|
||||
|
||||
| Rank | Candidate ID | Flow | Sessions (30d, ord.) | Funnel position | Revenue weight | Intervention known? (Y/N + 1-liner) | Fixability | Formula | Score | Verdict |
|
||||
|------|--------------|------|----------------------|-----------------|----------------|--------------------------------------|------------|---------|-------|---------|
|
||||
| 1 | P1-A | Subscription page mobile remainder — skeleton CLS, dialog overflow, safe-area padding (FN-345 family; from `docs/design-specs/post-p0-subscription-audit.md` §6/§9/§10) | M=2 | bottom=3 | high=2 | **Y** — apply audit §6/§9/§10 fixes (skeleton grid match, dialog max-h + scroll, env(safe-area-inset-bottom)) | H | 2 × 3 × 2 | **12** | ✅ **WIN** |
|
||||
| 2 | P1-B | Checkout/payment-failure retry UX — mirror FN-367 (Tekrar Dene + clear banner) on `payment-content.tsx` Iyzico-return + EFT-receipt error paths | L=1 | bottom=3 | high=2 | **Y** — port FN-367 banner+retry pattern; `payment_failed` event already exists for telemetry hook | H | 1 × 3 × 2 | **6** | ✅ **WIN** (tiebreaker H beats P1-C) |
|
||||
| 3 | P1-C | VIN-decode → parts-panel prefetch — call `useCategoryParts.prefetchQuery` on first leaf-category render after decode (FN-368 §6 "Out of scope — long-term fix") | H=3 | mid=2 | standard=1 | **Y** — `useQuery` cache wiring per TanStack Query docs; prefetch in `vehicles_/$id` loader | **M** (perf-sensitive: cache invalidation + over-fetch risk) | 3 × 2 × 1 | **6** | ❌ **REJECT** — ties P1-B on raw score, loses tiebreaker (M < H) |
|
||||
| 4 | P1-D | Grid-view parent-category navigation bug (FN-373) — Grid wraps every card in `<Link>` to leaf; parent click navigates to empty leaf route | M=2 | mid=2 | standard=1 | **Y** — mirror `CategoryColumns.handleSelect` lazy-fetch + push-column logic; spec'd in FN-373 PROMPT.md | H | 2 × 2 × 1 | **4** | ❌ **REJECT** — below score floor; route to normal sprint, not P1 CRO |
|
||||
| 5 | P1-E | EFT/havale residual docs scrub (FN-394) — strip references in `docs/`, `knowledge.md`, audit docs | N/A | n/a | n/a | **Y** — grep + classify per FN-394 PROMPT.md | H | 0 × 0 × 0 | **0** | ❌ **REJECT** — docs hygiene, not a CRO P1; covered by existing FN-394 |
|
||||
|
||||
### Winner promotion summary
|
||||
|
||||
| Rank | ID | Promoted to board task | Title |
|
||||
|------|----|-----------------------|-------|
|
||||
| 1 | P1-A | **FN-398** | P1: Subscription page mobile remainder — skeleton CLS, dialog overflow, safe-area (post-P0 audit §6/§9/§10) |
|
||||
| 2 | P1-B | **FN-397** | P1: Checkout/payment-failure retry UX — port FN-367 pattern to `payment-content.tsx` |
|
||||
|
||||
> Sidebar follow-up filed as **FN-399** (PostHog `person_profiles` verification — research-only).
|
||||
|
||||
---
|
||||
|
||||
## Research-only sidebar (high-impact, no singular intervention → NOT P1)
|
||||
|
||||
Per the scoring model: high-impact flows without a known intervention go to **research**, not P1. Items here are logged for visibility and routed to existing research/audit tasks instead of competing for P1 slots.
|
||||
|
||||
| Item | Why high-impact | Why no P1 intervention | Routed to |
|
||||
|------|-----------------|------------------------|-----------|
|
||||
| **App-wide failure-state UX standardization** — every async/user-triggered surface (search, filter, payment, login, contact form, saved cars, dashboard widgets) lacks the FN-367/FN-368 retry+skeleton+empty-state pattern | Cross-cutting friction across the entire authenticated app; touches every funnel step | Cannot be solved with one fix — needs (a) inventory of surfaces, (b) target-state spec for the shared component, (c) per-surface implementation tasks. No single intervention to score. | **FN-396** (existing) — audit + spec; spawns per-surface P2/P3 tasks once spec lands |
|
||||
| **Trial-banner / cancel-save / yearly-toggle attribution at the user level** — P0 instrumentation is in place (events fire) but cross-session person identification needs PostHog `person_profiles` config verified, otherwise `vin_decode_success → checkout_started` cannot be joined as a funnel | Conversion attribution for the entire CRO program depends on this | Not a UX fix; a config + verification question. Belongs in data ops, not P1 dev. | **FN-399** (filed) — verify PostHog `person_profiles: "identified_only"` config + write a regression check; assign Product/Data |
|
||||
| **`payment_success` pre-deploy baseline** — event was instrumented 2026-05-13 (FN-321/FN-313), so no pre-deploy data exists for the 3-step funnel `checkout_started → payment_initiated → payment_success` | Required for any future CRO A/B on payment surface | Cannot be back-filled; needs ≥14 days of clean post-deploy data | Defer; revisit after 2026-05-27 (14d post-instrumentation) |
|
||||
|
||||
---
|
||||
|
||||
## Baseline freeze (FN-368)
|
||||
|
||||
| Item | Value |
|
||||
|------|-------|
|
||||
| Baseline task | **FN-368** — Parts Panel rage-clicks / session abandonment after VIN decode |
|
||||
| Merged | 2026-05-14 18:43 UTC, commit `0ce68a7b` onto `dev` |
|
||||
| Files in baseline | `apps/web/src/components/schema/parts-panel.tsx`, `schema-viewer.tsx`, `__tests__/parts-panel.test.tsx` |
|
||||
| PostHog instrumentation snapshot | `docs/product/funnel-audit-p0-cro-2026-05.md` (2026-05-13) — full event inventory, all P0-1…P0-10 instrumented |
|
||||
| Live PostHog query link | **None used** (per constraint — frozen artifact only) |
|
||||
|
||||
Any post-shortlist comparison for the winners must use these frozen artifacts as the "before" reference. Re-querying PostHog after deploy is allowed only against the same event taxonomy listed in the frozen audits.
|
||||
|
||||
---
|
||||
|
||||
## CEO sign-off requested
|
||||
|
||||
- [ ] Approve winners (P1-A, P1-B) as the P1 sprint slate.
|
||||
- [ ] Acknowledge rejected items (P1-C, P1-D, P1-E) and the research sidebar routing.
|
||||
- [ ] Confirm FN-368 + the two 2026-05-13 funnel audits remain the frozen baseline for post-deploy comparison.
|
||||
|
||||
CEO note: This task ends at sign-off. Implementation of P1-A and P1-B is out of scope for FN-395 and will be tracked under the new board tasks listed in the Winner Promotion Summary.
|
||||
Reference in New Issue
Block a user