Curva ✕ Pasukuru — LINE-native ecommerce — Master Plan

Document map

FilePurpose
00-master-plan.md (this)Top-level rollup, phase summary, glossary
01-framework.mdPlanning framework — how every ticket is structured, named, tracked
02-phase-0-foundation.mdFoundation — webhook completion + identity column
03-phase-1-liff-wrap.mdLIFF wrap Pasukuru FE + identify endpoint
04-phase-2-ux-glue.mdCurva FlexMsg picker + RichMenu LIFF + Scenarios
05-phase-3-payment-agent.mdLINE Pay + agent QR + LIFF polish
06-phase-4-multishop.md(Optional) multi-shop per LINE OA
07-cross-cutting.mdInfra, Cloudflare/nginx, LINE Console, monitoring
08-test-strategy.mdPer-phase test gates + smoke test definition
09-risk-register.mdRisks, mitigations, kill-switches
10-jira-tickets.mdPre-drafted Jira tickets (CRV-XX + PASS-XX) ready to file

Phase summary (north star)

PhaseGoalItemsCC sessionsCalendar (parallel)Exit criteria
0 — FoundationFinish wired half. Make webhooks 2-way + add identity column.9~61 dayPasukuru emits order events. Curva receives + persists. member.line_user_id migrated.
1 — LIFF wrapPasukuru shopfront runs inside LINE.9~91-2 daysUser taps LINE → LIFF → sees products → adds to cart, identified by line_user_id, no double-account.
2 — UX glueCurva flows trigger Pasukuru.8~81-2 daysAdmin can build Flex Msg with Pasukuru products. Rich menu opens shop. Abandoned-cart scenario fires.
3 — Payment+agentLoop closure: LINE Pay + referral.9~92 daysLINE Pay live. Agent QR auto-tracks referral. Receipt pushed to LINE chat.
4 — Multi-shop (optional)One LINE OA → many Pasukuru shops.3~31 dayPartnerConnection M:N migrated. Shop-picker in Scenario builder.
X — Cross-cuttingInfra + tests + ops.5+3~72 daysSmoke test green. Webhook DLQ monitored. LIFF apps registered per tenant.

MVP cutline: Phase 0+1 + Phase 2 items {C5, C7} + Phase 3 item {C7 only — already in P0/2} = first demo. ~4-5 days parallel.

Full delivery: all phases except 4 = ~8-10 days parallel (~15-20 days serial).


Glossary

TermMeaning
CurvaLaravel 13 LINE OA control plane (COCONRobotics-Corp/Curva)
Pasukuru BENestJS 10 ecommerce backbone (COCONRobotics-Corp/pasukuru-be)
Pasukuru FENext.js 16 storefront (COCONRobotics-Corp/pasukuru-fe)
PartnerConnectionCurva model storing the Curva↔Pasukuru link (1 per LineAccount)
kuru / partner=‘kuru’Original name for Pasukuru in code (do NOT rename — too many references)
LineAccountCurva’s tenant unit = 1 LINE OA channel
Tenant (Pasukuru)resolved via Host header → adminId
LIFFLINE Front-end Framework (LINE WebView with SDK)
idTokenLINE-issued JWT proving line_user_id ownership
basicIdLINE OA “@xxx” public ID, used as curvaLineAccount in handshake
DLQDead letter queue (failed webhooks after retries)
CC sessionOne Claude Code working block, ~2-4hr equivalent

Naming conventions (HARD RULE)

  • Branch: user/corone-{JIRA}-{kebab-task} from develop
  • Curva Jira project: CRV (e.g. CRV-100)
  • Pasukuru Jira project: PASS (e.g. PASS-50)
  • Commit: [CRV-100] short summary or [PASS-50] short summary
  • PR title: [CRV-100] Summary — body has Requested by Julian (workspace attribution)
  • Workspace persona: kebahagiaan = Julian / time7676 (this work) — do NOT cross-post to Ryo

NO-TOUCH boundary

✅ CRV (Curva), PASS (Pasukuru) Jira projects — full read+write ❌ DVG (Da Vinci) — read-only, never write


Approval gates (before any code)

  • User approves master plan (this doc)
  • User approves Phase 0 ticket list (10-jira-tickets.md)
  • User confirms tenant resolution choice (path vs JWT) — see Phase 1 D-1 decision
  • User confirms LINE Pay in/out of MVP — see Phase 3 D-2 decision
  • User confirms multi-shop Phase 4 in/out — see Phase 4 D-3 decision

Phase 0 unblocks once gates 1-2 cleared.