Cross-cutting — Infra, Ops, Manual Tasks (~7 sessions, ~2 days)
Items that span phases or are manual user tasks. Not blocked by single phase but typically run in parallel with Phase 0-1.
Tracking matrix
| ID | Title | Track | Jira | CC | Risk | Owner | Status |
|---|---|---|---|---|---|---|---|
| X.I-1 | Create LIFF apps in LINE Console (3 per env) | I | n/a | manual | L | r_goto | Backlog |
| X.I-2 | Cloudflare/nginx routing for LIFF endpoints | I | INFRA-? | 1 | M | Julian | Backlog |
| X.I-3 | Staging Pasukuru tenant + Curva LineAccount setup | I | INFRA-? | 1 | L | Julian | Backlog |
| X.I-4 | BullMQ Board exposed for webhook DLQ monitoring | I | PASS-? | 0.5 | L | Julian | Backlog |
| X.I-5 | Cron for failed-webhook alert (Slack/email if DLQ > 10) | I | PASS-? | 0.5 | L | Julian | Backlog |
| X.T-1 | Joint smoke test script (automated) | T | both | 1 | L | Julian | Backlog |
| X.T-2 | Load test: 1000 concurrent LIFF identifies | T | PASS-? | 1 | M | Julian | Backlog |
| X.D-1 | Document admin training (1-page) | I | n/a | 0.5 | L | Julian | Backlog |
Total: 5.5 CC sessions + 1 manual.
X.I-1 — LIFF apps creation (MANUAL)
Owner: r_goto (LINE Developer Console access)
Required apps (per env staging + prod = 6 total):
For each env:
- Pasukuru Shop — endpoint URL
https://shop.passkuru.com/liff/shop(or per 1.D-1 final choice) - Pasukuru Cart —
https://shop.passkuru.com/liff/cart - Pasukuru Account —
https://shop.passkuru.com/liff/account
Each LIFF app needs:
- Size: Full
- Scopes:
profile openid email(email if enabled) - Endpoint URL: HTTPS only
- LINE Login channel: existing or new
Output: 6 LIFF IDs to drop into env vars.
X.I-2 — Nginx/Cloudflare routing
Goal: Route LIFF endpoint URLs to Pasukuru FE on VPS (Next.js, port 3200 currently).
Files to update:
/etc/nginx/sites-available/passkuru.cocon-lab.com(or newshop.passkuru.com)- Cloudflare DNS for
shop.passkuru.com - Cloudflare TLS via DNS-01
Rules:
/liff/shop→ Next.js/liff/cart→ Next.js/liff/account→ Next.jsSet-Cookie SameSite=None; Secureheaders passed through
Acceptance:
- HTTPS green via Let’s Encrypt (DNS-01)
- LINE Console URL verification passes for each LIFF endpoint
- No mixed-content warnings
X.I-3 — Staging tenants
Setup:
- Pasukuru staging tenant (admin account, domain
shop-staging.passkuru.com) - Curva staging LineAccount linked via existing handshake
- Test products (3-5)
- Test member with line_user_id from a real LINE dev account
Document credentials in 1Password / vault (NOT in git).
X.I-4 — Webhook DLQ monitoring
Goal: See failed webhooks in real time.
Steps:
- Add
bull-boardpackage to Pasukuru BE - Mount at
/admin/queuesbehind admin JWT - Document URL + access in vault
X.I-5 — Failure alerting
Goal: If curva-webhook DLQ > 10 jobs OR Curva inbound 5xx rate > 5% in 5min → alert.
Implementation:
- Cron task on Pasukuru BE checks queue depth every 5 min
- If threshold breached → POST to Slack webhook OR send email via existing Mailer
- Coordinated alert key (don’t spam every 5 min)
X.T-1 — Joint smoke test script
Goal: Automatable end-to-end test runnable against staging.
Script (Node.js, run from VPS):
- Curva: Create test order via test endpoint (helper)
- Pasukuru: Mark paid via test helper
- Wait 10s
- Assert: Curva log table has webhook entry
- Assert: Pasukuru DLQ size unchanged
- Assert: Member.line_user_id exists for test user
- Assert: Curva LineFollower has pasukuru_member_id (Phase 3+)
- Output: green/red summary
Run: pnpm smoke:integration:staging — exit code 0 = pass.
X.T-2 — Load test
Tool: k6 or autocannon Scenarios:
- 1000 concurrent
POST /integration/line/identify(simulating mass LIFF entry) - 100 concurrent webhook deliveries Curva-side
- Sustained 10 RPS for 10 min
Acceptance:
- p95 latency < 500ms identify
- p95 latency < 200ms webhook receive
- 0% 5xx
- DB connection pool not exhausted
X.D-1 — Admin training doc
Goal: 1-page guide for Curva admin to use new features.
Sections:
- Connect Pasukuru shop (existing handshake)
- Auto-register LIFF apps (1.C-12 button)
- Build Flex Msg with Pasukuru products (2.C-5)
- Add Pasukuru shop button to RichMenu (2.C-6)
- Use Abandoned Cart Scenario template (2.C-8)
- Get receipts in chat automatically (works once 2.C-7 deployed)
Format: Markdown in vault pages/concepts/curva-pasukuru-admin-guide.md. Optionally screenshot when UI ready.
Cross-cutting exit checklist
- All 6 LIFF apps registered (3 staging + 3 prod)
- DNS + nginx + TLS green for shop.passkuru.com
- Staging environment fully wired
- BullMQ board accessible
- Alerts configured + tested
- Smoke test script in repo + scheduled (cron or CI)
- Load test results documented
- Admin training doc in vault