Commits merged: - docs(FN-411): scoping output — spawned FN-415 (FN-367 mechanical verification) and FN-416 (FN-368 mechanical verification) - Merge pull request #21 — feat(FN-403): parts panel manifest - Merge pull request #20 — feat(FN-401): blocker note - Merge pull request #19 — feat(FN-400): selector manifest - Merge pull request #18 — feat(FN-399): PostHog cross-session funnel audit - Merge pull request #17 — chore(payments): Stripe-only - Merge pull request #16 — feat(FN-395): P1 candidate shortlist - Merge pull request #15 — broaden leaf detection - fix(categories): broaden leaf detection to all /extern/*/{vin,mdl}_items endpoints - Merge pull request #14 — fix(pl24): Ford VIN flow - Merge pull request 'dev' (#13) from dev into main - Merge pull request 'feat(FN-367): add inline retry affordance after VIN decode failure (FN-367, gitea #11)' (#12) from dev into main - Merge pull request 'dev' (#9) from dev into main - Merge pull request 'dev' (#8) from dev into main - Merge pull request 'docs(readme): spacing tweak — measure cache-enabled dev deploy speed' (#7) from dev into main - Merge pull request 'docs(readme): add staging URL — gitea deploy flow smoke test' (#4) from dev into main - Merge pull request 'dev' (#3) from dev into main Files changed: SCOPING-FN-411.md | 85 +++++++++++++++++++++++++++ apps/api/src/catalog/catalog.service.ts | 8 ++- apps/api/src/categories/categories.service.ts | 23 +++++--- 3 files changed, 107 insertions(+), 9 deletions(-) Fusion-Task-Id: FN-411
86 lines
3.8 KiB
Markdown
86 lines
3.8 KiB
Markdown
# FN-411 — Recon-to-Implementation Scoping Output
|
||
|
||
**Date:** 2026-05-16
|
||
**Inputs:**
|
||
- `MANIFEST.md` (FN-400 recon over FN-367 / VIN decoder)
|
||
- `MANIFEST-FN-403.md` (FN-403 recon over FN-368 / parts panel)
|
||
|
||
**Output:** Two new triage tasks created. Both classified **mechanical** per memory
|
||
`recon-to-implementation-scoping-pattern` — no FN-406-style UX-spec precursor required.
|
||
|
||
---
|
||
|
||
## Spawned tasks
|
||
|
||
### FN-415 — FN-367 VIN-decode retry verification + hit-target audit
|
||
|
||
- **Parent:** FN-367 (shipped `e274e02`).
|
||
- **Route:** `/dashboard/search` (`apps/web/src/routes/dashboard/search.tsx`).
|
||
- **New spec file:** `apps/web/e2e/vin-decode-retry.spec.ts` (location subject to repo Playwright dir convention; selectors are canonical).
|
||
- **Production edit (conditional):** Retry button hit-target widen to ≥44 px if measurement on `375 × 667` viewport fails the Apple HIG / Material baseline.
|
||
- **AC anchors:** locator stability (data-faro + role/name), retry-render guard
|
||
(NOT rendered on `"abone olun"` / `"tanınamadı"` branches), PostHog
|
||
`vin_decode_retry_clicked`, hit-target ≥44 px, no line-number assertions.
|
||
- **UX-spec precursor:** Not required.
|
||
|
||
### FN-416 — FN-368 parts-panel verification + hit-target audit
|
||
|
||
- **Parent:** FN-368 (shipped `0ce68a7`).
|
||
- **Component:** `apps/web/src/components/schema/parts-panel.tsx`.
|
||
- **Mount routes (4):** `vehicles_/$id/categories_/$categoryId`,
|
||
`catalog_/$brandName_/$modelId/categories_/$categoryId`,
|
||
`catalog_/emex/$catalogCode_/$vehicleId_/groups/$groupId`,
|
||
`catalog_/pcat/$catalogId_/$modelId_/$carId_/groups/$groupId`.
|
||
- **New spec file:** `apps/web/e2e/parts-panel.spec.ts`.
|
||
- **Production edits (conditional):** OEM copy button (≈18 px today), parts row
|
||
vertical (≈36 px today), "Geri don" empty-state escape (≈40 px today) — widen
|
||
to ≥44 px via minimal Tailwind token swap. Escalate to UX-spec precursor if
|
||
any widen forces layout reflow.
|
||
- **AC anchors:** inert-row no-op (FN-368 core fix), available-row toggle +
|
||
scrollIntoView, OEM copy `stopPropagation` + clipboard + PostHog +
|
||
`/analytics/oem-copy`, loading skeleton count = `SKELETON_ROW_KEYS.length`,
|
||
empty-state `Geri don` → `history.back()`, no line-number assertions.
|
||
- **UX-spec precursor:** Not required for verification + hit-target widen.
|
||
Required IF scope drifts into inline error UI on `<PartsPanel>` (currently
|
||
bubbles `use-parts` failures to `<SchemaViewer>` skeleton — design-novel).
|
||
|
||
---
|
||
|
||
## Classification rationale
|
||
|
||
Both follow-ups satisfy the **Mechanical** criteria from memory
|
||
`recon-to-implementation-scoping-pattern`:
|
||
|
||
1. Playwright/E2E verification of an already-shipped, UX-reviewed fix.
|
||
2. Hit-target widening to a published platform baseline (44 px).
|
||
3. Locator-stability assertions that consume existing
|
||
`data-faro-user-action-name` + ARIA hooks — no new hook attributes
|
||
requested.
|
||
|
||
Neither task introduces new copy, color, layout primitives, or skeleton
|
||
dimensions. Anything that would (e.g. an inline error UI on PartsPanel for
|
||
`use-parts` failures) is explicitly carved out as out-of-scope and gated on a
|
||
separate FN-406-style UX-spec precursor.
|
||
|
||
## Rubric scoring (FN-395 P1)
|
||
|
||
Per memory `rubric-scoring-for-verification-follow-ups`: both tasks inherit
|
||
their parent's P1 gate rather than competing on the FN-395 shortlist. Scored
|
||
for visibility, not gated on the 6-point floor.
|
||
|
||
## Drift hardening
|
||
|
||
Acceptance criteria in both child tasks refer to selectors by
|
||
`data-faro-user-action-name`, ARIA role/name, or visible text — never by line
|
||
number. FN-400 → FN-403 already demonstrated the cost of line-number coupling
|
||
(`schema-viewer.tsx:69-83` → `:72-86` shift in 2 days). See memory
|
||
`manifest-drift-convention`.
|
||
|
||
---
|
||
|
||
## Non-goals (for this scoping task — FN-411)
|
||
|
||
- No implementation. FN-411 is scoping only.
|
||
- No baseline/PostHog work (that's FN-396's surface).
|
||
- No EMEX/PL24/PartsCatalogs fetch-layer work.
|