@su-record/vibe 2.8.23 → 2.8.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commands/vibe.figma.md +2 -2
- package/dist/cli/commands/config.d.ts +17 -0
- package/dist/cli/commands/config.d.ts.map +1 -0
- package/dist/cli/commands/config.js +207 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/index.d.ts +2 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +2 -0
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +78 -54
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/stats.d.ts +13 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +280 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +33 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/postinstall/constants.d.ts.map +1 -1
- package/dist/cli/postinstall/constants.js +1 -0
- package/dist/cli/postinstall/constants.js.map +1 -1
- package/dist/cli/setup/GlobalInstaller.d.ts.map +1 -1
- package/dist/cli/setup/GlobalInstaller.js +7 -7
- package/dist/cli/setup/GlobalInstaller.js.map +1 -1
- package/dist/cli/setup/ProjectSetup.d.ts.map +1 -1
- package/dist/cli/setup/ProjectSetup.js +18 -12
- package/dist/cli/setup/ProjectSetup.js.map +1 -1
- package/dist/infra/lib/ContextCompressor.d.ts.map +1 -1
- package/dist/infra/lib/ContextCompressor.js +10 -4
- package/dist/infra/lib/ContextCompressor.js.map +1 -1
- package/dist/infra/lib/ProjectCache.d.ts +2 -2
- package/dist/infra/lib/ProjectCache.d.ts.map +1 -1
- package/dist/infra/lib/ProjectCache.js +4 -3
- package/dist/infra/lib/ProjectCache.js.map +1 -1
- package/dist/infra/lib/utils.d.ts +24 -0
- package/dist/infra/lib/utils.d.ts.map +1 -1
- package/dist/infra/lib/utils.js +41 -0
- package/dist/infra/lib/utils.js.map +1 -1
- package/dist/infra/orchestrator/SmartRouter.d.ts +3 -0
- package/dist/infra/orchestrator/SmartRouter.d.ts.map +1 -1
- package/dist/infra/orchestrator/SmartRouter.js +11 -1
- package/dist/infra/orchestrator/SmartRouter.js.map +1 -1
- package/dist/infra/orchestrator/SmartRouter.test.d.ts +5 -0
- package/dist/infra/orchestrator/SmartRouter.test.d.ts.map +1 -0
- package/dist/infra/orchestrator/SmartRouter.test.js +457 -0
- package/dist/infra/orchestrator/SmartRouter.test.js.map +1 -0
- package/dist/tools/convention/analyzeComplexity.d.ts.map +1 -1
- package/dist/tools/convention/analyzeComplexity.js +18 -10
- package/dist/tools/convention/analyzeComplexity.js.map +1 -1
- package/dist/tools/convention/checkCouplingCohesion.d.ts.map +1 -1
- package/dist/tools/convention/checkCouplingCohesion.js +14 -6
- package/dist/tools/convention/checkCouplingCohesion.js.map +1 -1
- package/dist/tools/semantic/analyzeDependencyGraph.d.ts.map +1 -1
- package/dist/tools/semantic/analyzeDependencyGraph.js +1 -1
- package/dist/tools/semantic/analyzeDependencyGraph.js.map +1 -1
- package/dist/tools/semantic/findReferences.d.ts.map +1 -1
- package/dist/tools/semantic/findReferences.js +13 -13
- package/dist/tools/semantic/findReferences.js.map +1 -1
- package/dist/tools/semantic/findSymbol.d.ts.map +1 -1
- package/dist/tools/semantic/findSymbol.js +12 -13
- package/dist/tools/semantic/findSymbol.js.map +1 -1
- package/dist/tools/semantic/lsp.d.ts.map +1 -1
- package/dist/tools/semantic/lsp.js +22 -14
- package/dist/tools/semantic/lsp.js.map +1 -1
- package/hooks/hooks.json +29 -0
- package/hooks/scripts/__tests__/keyword-detector.test.js +199 -0
- package/hooks/scripts/__tests__/pre-tool-guard.test.js +286 -0
- package/hooks/scripts/__tests__/sentinel-guard.test.js +210 -0
- package/hooks/scripts/auto-commit.js +65 -0
- package/hooks/scripts/auto-format.js +64 -0
- package/hooks/scripts/auto-test.js +81 -0
- package/hooks/scripts/code-check.js +139 -0
- package/hooks/scripts/command-log.js +32 -0
- package/hooks/scripts/context-save.js +60 -6
- package/hooks/scripts/hud-status.js +32 -2
- package/hooks/scripts/llm-orchestrate.js +95 -17
- package/hooks/scripts/pr-test-gate.js +52 -0
- package/package.json +1 -1
- package/skills/agents-md/rubrics/what-to-keep.md +49 -0
- package/skills/agents-md/templates/agents-md.md +36 -0
- package/skills/arch-guard/agents/detector.md +48 -0
- package/skills/arch-guard/agents/reporter.md +48 -0
- package/skills/arch-guard/agents/rule-generator.md +49 -0
- package/skills/arch-guard/agents/violation-checker.md +51 -0
- package/skills/arch-guard/frameworks/clean-architecture.md +108 -0
- package/skills/arch-guard/frameworks/solid.md +102 -0
- package/skills/arch-guard/scripts/check-boundaries.js +90 -0
- package/skills/arch-guard/templates/arch-rules.json +47 -0
- package/skills/arch-guard/templates/violation-report.md +53 -0
- package/skills/brand-assets/rubrics/asset-checklist.md +98 -0
- package/skills/brand-assets/templates/brand-guide.md +161 -0
- package/skills/capability-loop/agents/capability-designer.md +61 -0
- package/skills/capability-loop/agents/failure-analyst.md +55 -0
- package/skills/capability-loop/agents/implementer.md +50 -0
- package/skills/capability-loop/agents/tester.md +53 -0
- package/skills/capability-loop/templates/capability-spec.md +118 -0
- package/skills/capability-loop/templates/failure-analysis.md +118 -0
- package/skills/characterization-test/agents/behavior-capturer.md +50 -0
- package/skills/characterization-test/agents/coverage-checker.md +54 -0
- package/skills/characterization-test/agents/reporter.md +50 -0
- package/skills/characterization-test/agents/test-writer.md +49 -0
- package/skills/characterization-test/rubrics/coverage-criteria.md +53 -0
- package/skills/characterization-test/templates/test-template.ts +101 -0
- package/skills/claude-md-guide/rubrics/anti-patterns.md +88 -0
- package/skills/claude-md-guide/templates/claude-md.md +54 -0
- package/skills/commerce-patterns/rubrics/checkout-flow.md +48 -0
- package/skills/commerce-patterns/templates/product-schema.md +85 -0
- package/skills/commit-push-pr/agents/change-analyzer.md +55 -0
- package/skills/commit-push-pr/agents/message-writer.md +50 -0
- package/skills/commit-push-pr/agents/pr-writer.md +58 -0
- package/skills/commit-push-pr/agents/reviewer.md +52 -0
- package/skills/commit-push-pr/rubrics/commit-message.md +73 -0
- package/skills/commit-push-pr/templates/pr-body.md +63 -0
- package/skills/context7-usage/rubrics/when-to-use.md +50 -0
- package/skills/create-prd/agents/edge-case-finder.md +48 -0
- package/skills/create-prd/agents/prioritizer.md +60 -0
- package/skills/create-prd/agents/requirements-writer.md +48 -0
- package/skills/create-prd/agents/researcher.md +55 -0
- package/skills/create-prd/agents/reviewer.md +54 -0
- package/skills/create-prd/frameworks/jobs-to-be-done.md +96 -0
- package/skills/create-prd/frameworks/rice-scoring.md +97 -0
- package/skills/create-prd/orchestrator.md +70 -0
- package/skills/create-prd/rubrics/completeness.md +58 -0
- package/skills/create-prd/templates/prd.md +139 -0
- package/skills/design-audit/agents/a11y-auditor.md +43 -0
- package/skills/design-audit/agents/performance-auditor.md +46 -0
- package/skills/design-audit/agents/responsive-auditor.md +46 -0
- package/skills/design-audit/agents/scorer.md +47 -0
- package/skills/design-audit/agents/slop-detector.md +47 -0
- package/skills/design-audit/frameworks/core-web-vitals.md +107 -0
- package/skills/design-audit/frameworks/wcag-checklist.md +64 -0
- package/skills/design-audit/orchestrator.md +64 -0
- package/skills/design-audit/rubrics/ai-slop-patterns.md +83 -0
- package/skills/design-audit/rubrics/scoring.md +63 -0
- package/skills/design-audit/templates/report.md +88 -0
- package/skills/design-critique/rubrics/ux-heuristics.md +143 -0
- package/skills/design-critique/templates/critique-report.md +86 -0
- package/skills/design-distill/templates/design-system.md +132 -0
- package/skills/design-normalize/rubrics/token-naming.md +117 -0
- package/skills/design-normalize/templates/token-audit.md +89 -0
- package/skills/design-polish/rubrics/polish-checklist.md +68 -0
- package/skills/design-polish/templates/polish-report.md +64 -0
- package/skills/design-teach/rubrics/brand-personality.md +73 -0
- package/skills/design-teach/templates/design-context.json +36 -0
- package/skills/e2e-commerce/templates/test-scenarios.md +170 -0
- package/skills/event-comms/templates/email-invite.md +99 -0
- package/skills/event-comms/templates/sns-post.md +133 -0
- package/skills/event-ops/rubrics/contingency.md +85 -0
- package/skills/event-ops/templates/d-day-checklist.md +65 -0
- package/skills/event-planning/rubrics/timeline.md +70 -0
- package/skills/event-planning/templates/event-plan.md +91 -0
- package/skills/exec-plan/agents/decomposer.md +47 -0
- package/skills/exec-plan/agents/dependency-mapper.md +44 -0
- package/skills/exec-plan/agents/estimator.md +43 -0
- package/skills/exec-plan/agents/validator.md +55 -0
- package/skills/exec-plan/orchestrator.md +70 -0
- package/skills/exec-plan/rubrics/complexity-scoring.md +75 -0
- package/skills/exec-plan/templates/plan.md +147 -0
- package/skills/git-worktree/rubrics/when-to-use.md +55 -0
- package/skills/handoff/agents/context-summarizer.md +51 -0
- package/skills/handoff/agents/document-writer.md +63 -0
- package/skills/handoff/agents/state-collector.md +53 -0
- package/skills/handoff/agents/verifier.md +48 -0
- package/skills/handoff/rubrics/completeness.md +62 -0
- package/skills/handoff/templates/handoff.md +107 -0
- package/skills/parallel-research/agents/best-practices.md +43 -0
- package/skills/parallel-research/agents/codebase-patterns.md +46 -0
- package/skills/parallel-research/agents/framework-docs.md +45 -0
- package/skills/parallel-research/agents/security-advisory.md +46 -0
- package/skills/parallel-research/agents/synthesizer.md +52 -0
- package/skills/parallel-research/experts/best-practices.md +50 -0
- package/skills/parallel-research/experts/codebase-patterns.md +70 -0
- package/skills/parallel-research/experts/framework-docs.md +65 -0
- package/skills/parallel-research/experts/security-advisory.md +69 -0
- package/skills/parallel-research/orchestrator.md +65 -0
- package/skills/parallel-research/templates/synthesis.md +101 -0
- package/skills/prioritization-frameworks/rubrics/frameworks.md +79 -0
- package/skills/prioritization-frameworks/templates/scoring-matrix.md +69 -0
- package/skills/priority-todos/rubrics/prioritization.md +70 -0
- package/skills/priority-todos/templates/todo-board.md +59 -0
- package/skills/seo-checklist/frameworks/structured-data.md +153 -0
- package/skills/seo-checklist/rubrics/content-seo.md +42 -0
- package/skills/seo-checklist/rubrics/technical-seo.md +48 -0
- package/skills/techdebt/agents/analyzer.md +50 -0
- package/skills/techdebt/agents/fixer.md +41 -0
- package/skills/techdebt/agents/reviewer.md +47 -0
- package/skills/techdebt/agents/scanner.md +44 -0
- package/skills/techdebt/orchestrator.md +70 -0
- package/skills/techdebt/rubrics/severity.md +51 -0
- package/skills/techdebt/scripts/scan.js +90 -0
- package/skills/techdebt/templates/report.md +86 -0
- package/skills/tool-fallback/rubrics/fallback-chain.md +58 -0
- package/skills/typescript-advanced-types/rubrics/type-patterns.md +109 -0
- package/skills/ui-ux-pro-max/rubrics/interaction-states.md +83 -0
- package/skills/ui-ux-pro-max/rubrics/responsive-breakpoints.md +99 -0
- package/skills/user-personas/rubrics/research-methods.md +56 -0
- package/skills/user-personas/templates/persona.md +89 -0
- package/skills/vercel-react-best-practices/rubrics/performance.md +82 -0
- package/skills/vercel-react-best-practices/rubrics/server-components.md +86 -0
- package/skills/vibe-docs/SKILL.md +171 -0
- package/skills/vibe-docs/templates/architecture.md +80 -0
- package/skills/vibe-docs/templates/readme.md +84 -0
- package/skills/vibe-docs/templates/release-notes.md +74 -0
- package/skills/vibe-figma/SKILL.md +173 -54
- package/skills/vibe-figma/rubrics/extraction-checklist.md +51 -0
- package/skills/vibe-figma/templates/figma-handoff.md +96 -0
- package/skills/vibe-figma-analyze/rubrics/analysis-dimensions.md +53 -0
- package/skills/vibe-figma-codegen/rubrics/code-quality.md +54 -0
- package/skills/vibe-figma-consolidate/templates/consolidation-report.md +95 -0
- package/skills/vibe-figma-convert/SKILL.md +176 -1
- package/skills/vibe-figma-convert/rubrics/conversion-rules.md +83 -0
- package/skills/vibe-figma-convert/templates/component.md +152 -0
- package/skills/vibe-figma-extract/rubrics/image-rules.md +67 -0
- package/skills/vibe-figma-frame/rubrics/frame-selection.md +55 -0
- package/skills/vibe-figma-pipeline/rubrics/pipeline-stages.md +96 -0
- package/skills/vibe-figma-rules/rubrics/naming-conventions.md +70 -0
- package/skills/vibe-figma-style/rubrics/style-mapping.md +100 -0
- package/skills/video-production/rubrics/quality-checklist.md +58 -0
- package/skills/video-production/templates/production-plan.md +104 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# E2E Commerce Test Scenario Template
|
|
2
|
+
|
|
3
|
+
## Setup
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
// {{TEST_FILE}}.spec.ts
|
|
7
|
+
import { test, expect } from "@playwright/test";
|
|
8
|
+
import { setupServer } from "msw/node";
|
|
9
|
+
import { http, HttpResponse } from "msw";
|
|
10
|
+
|
|
11
|
+
// Seed test data once per suite — clean up in afterAll
|
|
12
|
+
test.beforeAll(async ({ request }) => {
|
|
13
|
+
await request.post("/api/test/seed", {
|
|
14
|
+
data: {
|
|
15
|
+
product: { id: "{{PRODUCT_ID}}", stock: 10, price: {{PRICE}} },
|
|
16
|
+
user: { email: "{{TEST_USER_EMAIL}}", password: "{{TEST_USER_PASSWORD}}" },
|
|
17
|
+
coupon: { code: "{{COUPON_CODE}}", type: "percentage", value: 10 },
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test.afterAll(async ({ request }) => {
|
|
23
|
+
await request.post("/api/test/cleanup", { data: { scope: "{{TEST_SUITE_ID}}" } });
|
|
24
|
+
});
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## P0 — Happy Path Checkout
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
test("happy path: cart → checkout → payment → confirmation", async ({ page }) => {
|
|
31
|
+
// 1. Add to cart
|
|
32
|
+
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
33
|
+
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
34
|
+
await page.getByRole("link", { name: "View Cart" }).click();
|
|
35
|
+
|
|
36
|
+
// 2. Proceed to checkout
|
|
37
|
+
await expect(page.getByText("{{PRODUCT_NAME}}")).toBeVisible();
|
|
38
|
+
await page.getByRole("button", { name: "Checkout" }).click();
|
|
39
|
+
|
|
40
|
+
// 3. Fill shipping
|
|
41
|
+
await page.fill('[name="address"]', "{{TEST_ADDRESS}}");
|
|
42
|
+
await page.fill('[name="city"]', "{{TEST_CITY}}");
|
|
43
|
+
await page.getByRole("button", { name: "Continue to Payment" }).click();
|
|
44
|
+
|
|
45
|
+
// 4. Pay (use PG sandbox card)
|
|
46
|
+
await page.fill('[name="cardNumber"]', "{{SANDBOX_CARD_NUMBER}}");
|
|
47
|
+
await page.fill('[name="expiry"]', "{{SANDBOX_CARD_EXPIRY}}");
|
|
48
|
+
await page.fill('[name="cvv"]', "{{SANDBOX_CARD_CVV}}");
|
|
49
|
+
await page.getByRole("button", { name: "Place Order" }).click();
|
|
50
|
+
|
|
51
|
+
// 5. Confirm — verify order status text, not just URL
|
|
52
|
+
await page.waitForURL("**/order-confirmation/**");
|
|
53
|
+
await expect(page.getByText("Order Confirmed")).toBeVisible();
|
|
54
|
+
await expect(page.getByTestId("order-id")).not.toBeEmpty();
|
|
55
|
+
});
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## P0 — Payment Failure + Stock Release
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
test("payment failure releases reserved stock", async ({ page, request }) => {
|
|
62
|
+
const stockBefore = await request
|
|
63
|
+
.get("/api/products/{{PRODUCT_ID}}/stock")
|
|
64
|
+
.then((r) => r.json());
|
|
65
|
+
|
|
66
|
+
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
67
|
+
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
68
|
+
await page.goto("/checkout");
|
|
69
|
+
await page.fill('[name="cardNumber"]', "4000000000000002"); // Decline card
|
|
70
|
+
|
|
71
|
+
await page.getByRole("button", { name: "Place Order" }).click();
|
|
72
|
+
await expect(page.getByText(/payment failed|declined/i)).toBeVisible();
|
|
73
|
+
|
|
74
|
+
// Verify stock is released — not just error shown
|
|
75
|
+
const stockAfter = await request
|
|
76
|
+
.get("/api/products/{{PRODUCT_ID}}/stock")
|
|
77
|
+
.then((r) => r.json());
|
|
78
|
+
expect(stockAfter.available).toBe(stockBefore.available);
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## P0 — Duplicate Payment Prevention
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
test("double-click does not create duplicate order", async ({ page, request }) => {
|
|
86
|
+
await page.goto("/checkout?prefilled=true");
|
|
87
|
+
const submitBtn = page.getByRole("button", { name: "Place Order" });
|
|
88
|
+
|
|
89
|
+
// Simulate double-click simultaneously
|
|
90
|
+
await Promise.all([submitBtn.click(), submitBtn.click()]);
|
|
91
|
+
await page.waitForURL("**/order-confirmation/**");
|
|
92
|
+
|
|
93
|
+
const orderId = await page.getByTestId("order-id").textContent();
|
|
94
|
+
|
|
95
|
+
// Verify only one order was created via API
|
|
96
|
+
const orders = await request
|
|
97
|
+
.get(`/api/orders?reference={{TEST_IDEMPOTENCY_KEY}}`)
|
|
98
|
+
.then((r) => r.json());
|
|
99
|
+
expect(orders.total).toBe(1);
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## P0 — Out-of-Stock Blocks Checkout
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
test("out-of-stock product blocks checkout with clear message", async ({ page, request }) => {
|
|
107
|
+
// Deplete stock via test API
|
|
108
|
+
await request.post("/api/test/deplete-stock", { data: { productId: "{{PRODUCT_ID}}" } });
|
|
109
|
+
|
|
110
|
+
await page.goto("/checkout?prefilled=true");
|
|
111
|
+
await page.getByRole("button", { name: "Place Order" }).click();
|
|
112
|
+
|
|
113
|
+
await expect(page.getByText(/out of stock|unavailable/i)).toBeVisible();
|
|
114
|
+
await expect(page).not.toHaveURL("**/order-confirmation/**");
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## P1 — Coupon Calculation
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
test("percentage coupon applies correct discount", async ({ page }) => {
|
|
122
|
+
await page.goto("/cart");
|
|
123
|
+
await page.fill('[name="couponCode"]', "{{COUPON_CODE}}");
|
|
124
|
+
await page.getByRole("button", { name: "Apply" }).click();
|
|
125
|
+
|
|
126
|
+
const total = await page.getByTestId("cart-total").textContent();
|
|
127
|
+
// {{PRICE}} * (1 - 0.10) = expected total
|
|
128
|
+
await expect(page.getByTestId("discount-amount")).toContainText("{{EXPECTED_DISCOUNT}}");
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## P1 — Cart Merge on Login
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
test("guest cart merges into user cart on login", async ({ page }) => {
|
|
136
|
+
// Add item as guest
|
|
137
|
+
await page.goto("/products/{{PRODUCT_SLUG}}");
|
|
138
|
+
await page.getByRole("button", { name: "Add to Cart" }).click();
|
|
139
|
+
|
|
140
|
+
// Login
|
|
141
|
+
await page.goto("/login");
|
|
142
|
+
await page.fill('[name="email"]', "{{TEST_USER_EMAIL}}");
|
|
143
|
+
await page.fill('[name="password"]', "{{TEST_USER_PASSWORD}}");
|
|
144
|
+
await page.getByRole("button", { name: "Sign In" }).click();
|
|
145
|
+
|
|
146
|
+
// Guest cart item should appear in user cart
|
|
147
|
+
await page.goto("/cart");
|
|
148
|
+
await expect(page.getByText("{{PRODUCT_NAME}}")).toBeVisible();
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## MSW Mock PG Server (CI)
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
// mocks/pg-server.ts
|
|
156
|
+
export const pgHandlers = [
|
|
157
|
+
http.post("{{PG_ENDPOINT}}", async ({ request }) => {
|
|
158
|
+
const body = await request.json() as Record<string, unknown>;
|
|
159
|
+
const card = body.cardNumber as string;
|
|
160
|
+
|
|
161
|
+
if (card === "4000000000000002") {
|
|
162
|
+
return HttpResponse.json({ status: "FAILED", code: "CARD_DECLINED" }, { status: 400 });
|
|
163
|
+
}
|
|
164
|
+
return HttpResponse.json({
|
|
165
|
+
status: "APPROVED",
|
|
166
|
+
transactionId: `mock_${Date.now()}`,
|
|
167
|
+
});
|
|
168
|
+
}),
|
|
169
|
+
];
|
|
170
|
+
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Event Email Invitation Template
|
|
2
|
+
|
|
3
|
+
> Delivery method: Gmail OAuth 2.0 — MUST use BCC (never expose attendee emails)
|
|
4
|
+
> Timing: Use per D-Day schedule from event-planning skill
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Registration Open Announcement
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
Subject: [{{EVENT_NAME}}] {{EDITION}}회 참가 신청 안내
|
|
12
|
+
|
|
13
|
+
{{ATTENDEE_NAME}}님 안녕하세요.
|
|
14
|
+
|
|
15
|
+
{{COMMUNITY_NAME}}에서 {{EDITION}}회 행사를 안내드립니다.
|
|
16
|
+
|
|
17
|
+
■ 주제: {{THEME}}
|
|
18
|
+
■ 일시: {{DATE}} {{TIME}}
|
|
19
|
+
■ 장소: {{VENUE}}
|
|
20
|
+
■ 참가비: {{FEE}}
|
|
21
|
+
|
|
22
|
+
이번 행사에서 다루는 내용:
|
|
23
|
+
{{WHAT_YOU_WILL_LEARN_1}}
|
|
24
|
+
{{WHAT_YOU_WILL_LEARN_2}}
|
|
25
|
+
{{WHAT_YOU_WILL_LEARN_3}}
|
|
26
|
+
|
|
27
|
+
참가 신청: {{REGISTRATION_URL}}
|
|
28
|
+
|
|
29
|
+
신청 마감: {{DEADLINE}}
|
|
30
|
+
|
|
31
|
+
감사합니다.
|
|
32
|
+
{{COMMUNITY_NAME}} 드림
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Attendance Confirmation Email (D-3)
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
Subject: [{{EVENT_NAME}}] {{EDITION}}회 참가 확정 안내
|
|
41
|
+
|
|
42
|
+
{{ATTENDEE_NAME}}님 안녕하세요.
|
|
43
|
+
|
|
44
|
+
{{EVENT_NAME}} {{EDITION}}회 참가가 확정되었습니다.
|
|
45
|
+
소중한 시간 내주셔서 감사합니다.
|
|
46
|
+
|
|
47
|
+
■ 일시: {{DATE}} {{TIME}}
|
|
48
|
+
■ 장소: {{VENUE_DETAIL}}
|
|
49
|
+
{{VENUE_ADDRESS}}
|
|
50
|
+
{{VENUE_TRANSPORT}}
|
|
51
|
+
|
|
52
|
+
■ 프로그램:
|
|
53
|
+
{{TIMETABLE_LINE_1}}
|
|
54
|
+
{{TIMETABLE_LINE_2}}
|
|
55
|
+
{{TIMETABLE_LINE_3}}
|
|
56
|
+
|
|
57
|
+
■ 실시간 질문: {{SLIDO_LINK}}
|
|
58
|
+
|
|
59
|
+
당일 현장에서 뵙겠습니다.
|
|
60
|
+
감사합니다.
|
|
61
|
+
|
|
62
|
+
{{COMMUNITY_NAME}} 드림
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Post-Event Thank You + Recording Link
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
Subject: [{{EVENT_NAME}}] {{EDITION}}회 참석 감사드립니다
|
|
71
|
+
|
|
72
|
+
{{ATTENDEE_NAME}}님 안녕하세요.
|
|
73
|
+
|
|
74
|
+
{{EVENT_NAME}} {{EDITION}}회에 참석해 주셔서 진심으로 감사드립니다.
|
|
75
|
+
|
|
76
|
+
■ 행사 후기:
|
|
77
|
+
{{REVIEW_SUMMARY}}
|
|
78
|
+
|
|
79
|
+
■ 발표 자료:
|
|
80
|
+
{{SLIDE_URL_1}} — {{SPEAKER_1_NAME}}
|
|
81
|
+
{{SLIDE_URL_2}} — {{SPEAKER_2_NAME}}
|
|
82
|
+
|
|
83
|
+
■ 녹화 영상 (있는 경우):
|
|
84
|
+
{{VIDEO_URL}}
|
|
85
|
+
|
|
86
|
+
다음 행사 소식도 기대해 주세요.
|
|
87
|
+
|
|
88
|
+
감사합니다.
|
|
89
|
+
{{COMMUNITY_NAME}} 드림
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Usage Notes
|
|
95
|
+
|
|
96
|
+
- Replace all `{{PLACEHOLDER}}` values before sending
|
|
97
|
+
- BCC field only — the `To:` field should be your own sender address or a placeholder
|
|
98
|
+
- Test with `testmode_yn=Y` equivalent before real send
|
|
99
|
+
- Confirm send with event organizer before dispatch
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Social Media Post Template
|
|
2
|
+
|
|
3
|
+
> Platform tone guide: LinkedIn = professional/formal | Threads = casual/hooking
|
|
4
|
+
> See event-comms SKILL.md for full tone and length guidelines
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## LinkedIn — Event Announcement (Open)
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
{{HOOK_SENTENCE — expert framing, why this matters}}
|
|
12
|
+
|
|
13
|
+
{{EVENT_NAME}} {{EDITION}}회를 소개합니다.
|
|
14
|
+
|
|
15
|
+
📅 {{DATE}} {{TIME}}
|
|
16
|
+
📍 {{VENUE}}
|
|
17
|
+
|
|
18
|
+
이번 주제: {{THEME}}
|
|
19
|
+
|
|
20
|
+
{{SPEAKER_1_NAME}} ({{SPEAKER_1_ROLE}}, {{SPEAKER_1_COMPANY}})
|
|
21
|
+
— {{TOPIC_1}}
|
|
22
|
+
|
|
23
|
+
{{SPEAKER_2_NAME}} ({{SPEAKER_2_ROLE}}, {{SPEAKER_2_COMPANY}})
|
|
24
|
+
— {{TOPIC_2}}
|
|
25
|
+
|
|
26
|
+
{{CTA — "지금 바로 신청하세요 →" + REGISTRATION_URL}}
|
|
27
|
+
|
|
28
|
+
#{{HASHTAG_1}} #{{HASHTAG_2}} #{{HASHTAG_3}}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## LinkedIn — Deadline Reminder (D-14)
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
{{URGENCY_HOOK — "마감이 {{N}}일 남았습니다"}}
|
|
37
|
+
|
|
38
|
+
{{EVENT_NAME}} {{EDITION}}회 신청 마감이 다가오고 있습니다.
|
|
39
|
+
|
|
40
|
+
현재 {{REGISTERED_COUNT}}명이 신청하셨고,
|
|
41
|
+
{{REMAINING_SPOTS}}자리가 남아 있습니다.
|
|
42
|
+
|
|
43
|
+
📅 {{DATE}} {{TIME}}
|
|
44
|
+
📍 {{VENUE}}
|
|
45
|
+
|
|
46
|
+
{{REGISTRATION_URL}}
|
|
47
|
+
|
|
48
|
+
#{{HASHTAG_1}} #{{HASHTAG_2}}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## LinkedIn — Post-Event Review (D+1)
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
{{STORY_HOOK — emotional or surprising moment from the event}}
|
|
57
|
+
|
|
58
|
+
어제 {{EVENT_NAME}} {{EDITION}}회가 성공적으로 마무리되었습니다.
|
|
59
|
+
|
|
60
|
+
이번 행사에서 얻은 3가지 인사이트:
|
|
61
|
+
|
|
62
|
+
1️⃣ {{INSIGHT_1}}
|
|
63
|
+
2️⃣ {{INSIGHT_2}}
|
|
64
|
+
3️⃣ {{INSIGHT_3}}
|
|
65
|
+
|
|
66
|
+
{{SPEAKER_THANK_YOU}}
|
|
67
|
+
|
|
68
|
+
다음 {{EVENT_NAME}} {{NEXT_EDITION}}회 소식도 기대해 주세요.
|
|
69
|
+
|
|
70
|
+
{{COMMUNITY_LINK}}
|
|
71
|
+
|
|
72
|
+
#{{HASHTAG_1}} #{{HASHTAG_2}}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## Threads — Event Announcement (Open)
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
{{CASUAL_HOOK — conversational, relatable opener}}
|
|
81
|
+
|
|
82
|
+
{{EVENT_NAME}} {{EDITION}}회 열린다!
|
|
83
|
+
|
|
84
|
+
{{DATE}} {{TIME}}
|
|
85
|
+
{{VENUE_SHORT}}
|
|
86
|
+
|
|
87
|
+
{{TOPIC_CASUAL_1줄}}
|
|
88
|
+
|
|
89
|
+
신청: {{REGISTRATION_URL}}
|
|
90
|
+
|
|
91
|
+
{{CASUAL_CTA — "같이 가실 분?" / "놓치지 마세요!"}}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Threads — Deadline Reminder (D-14)
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
아직 신청 안 하셨나요?
|
|
100
|
+
|
|
101
|
+
{{EVENT_NAME}} {{EDITION}}회
|
|
102
|
+
{{N}}일 후 마감입니다.
|
|
103
|
+
|
|
104
|
+
{{REMAINING_SPOTS}}자리 남음
|
|
105
|
+
|
|
106
|
+
→ {{REGISTRATION_URL}}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Threads — Post-Event Review (D+1)
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
{{EVENT_NAME}} {{EDITION}}회 끝났습니다.
|
|
115
|
+
|
|
116
|
+
어제 {{KEY_MOMENT_CASUAL}}.
|
|
117
|
+
|
|
118
|
+
다음엔 꼭 오세요 :)
|
|
119
|
+
|
|
120
|
+
{{NEXT_EVENT_TEASER}}
|
|
121
|
+
|
|
122
|
+
{{COMMUNITY_LINK}}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Usage Notes
|
|
128
|
+
|
|
129
|
+
- LinkedIn posts: 300+ characters, include line breaks for readability
|
|
130
|
+
- Threads posts: 150–200 characters, punchy and direct
|
|
131
|
+
- No emoji in SMS — but emoji is acceptable in LinkedIn and Threads
|
|
132
|
+
- Replace all `{{PLACEHOLDER}}` values before publishing
|
|
133
|
+
- Confirm publish with event organizer for official community accounts
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Contingency Plan for Common Event Issues
|
|
2
|
+
|
|
3
|
+
## Speaker No-Show
|
|
4
|
+
|
|
5
|
+
| Severity | Trigger | Response |
|
|
6
|
+
|----------|---------|----------|
|
|
7
|
+
| High | Speaker unreachable 30 min before event | Call + SMS every 5 min. At T-15 min, announce brief delay. At T-0, proceed without or re-order sessions. |
|
|
8
|
+
|
|
9
|
+
**Mitigation (do in advance):**
|
|
10
|
+
- [ ] Backup speaker or moderator-led discussion identified at D-3
|
|
11
|
+
- [ ] Speaker has organizer's phone number, not just email
|
|
12
|
+
- [ ] Session slides received by D-1 (presenter can proceed without speaker for key points)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## A/V Failure (Projector / Screen)
|
|
17
|
+
|
|
18
|
+
| Issue | Immediate Action |
|
|
19
|
+
|-------|----------------|
|
|
20
|
+
| No HDMI signal | Swap adapter → try different port → use backup laptop |
|
|
21
|
+
| Projector lamp failure | Use TV monitor if available; announce "slides on Slido" as fallback |
|
|
22
|
+
| No audio from mic | Switch to backup mic → use presenter's natural voice for small rooms |
|
|
23
|
+
|
|
24
|
+
**Prevention:**
|
|
25
|
+
- [ ] HDMI cable + adapters (USB-C, Mini DisplayPort) in equipment bag
|
|
26
|
+
- [ ] Backup laptop with slides loaded and tested
|
|
27
|
+
- [ ] Portable Bluetooth speaker for audio fallback (small venues)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Zoom / Streaming Failure (Online/Hybrid)
|
|
32
|
+
|
|
33
|
+
| Issue | Immediate Action |
|
|
34
|
+
|-------|----------------|
|
|
35
|
+
| Zoom disconnected | Restart app → new meeting link sent via pre-drafted SMS/email |
|
|
36
|
+
| Screen share freeze | Stop/restart screen share → switch to phone hotspot if network issue |
|
|
37
|
+
| No audio online | Confirm mic selected in Zoom settings → use phone as audio backup |
|
|
38
|
+
|
|
39
|
+
**Prevention:**
|
|
40
|
+
- [ ] Backup meeting link created and ready to send
|
|
41
|
+
- [ ] Phone hotspot available as network backup
|
|
42
|
+
- [ ] Co-host assigned to monitor chat/Q&A independently
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Low Attendance
|
|
47
|
+
|
|
48
|
+
| Threshold | Action |
|
|
49
|
+
|-----------|--------|
|
|
50
|
+
| < 50% of registered | Proceed normally — lower numbers often mean more intimate discussion |
|
|
51
|
+
| < 10 people (offline) | Reconfigure seating to feel intimate, not sparse |
|
|
52
|
+
|
|
53
|
+
**Notes:** Never cancel due to low attendance once speakers are confirmed. Record event for future distribution.
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Over-Capacity
|
|
58
|
+
|
|
59
|
+
| Threshold | Action |
|
|
60
|
+
|-----------|--------|
|
|
61
|
+
| >10% over room capacity | Direct overflow to live stream or waiting area |
|
|
62
|
+
| Fire safety limit reached | Stop admission at door, offer recording link |
|
|
63
|
+
|
|
64
|
+
**Prevention:**
|
|
65
|
+
- [ ] Registration cap set at 80–90% of room capacity
|
|
66
|
+
- [ ] Waitlist managed actively from D-14
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Payment / Settlement Issue
|
|
71
|
+
|
|
72
|
+
| Issue | Action |
|
|
73
|
+
|-------|--------|
|
|
74
|
+
| PG settlement delayed | Note expected settlement date, record in settlement report |
|
|
75
|
+
| Attendee requests refund day-of | Log name + contact, process after event via standard refund flow |
|
|
76
|
+
| Expense receipt missing | Request digital receipt same day — harder to get after 24 hours |
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## General Escalation Protocol
|
|
81
|
+
|
|
82
|
+
1. Assess severity: **Can the event continue?** → Yes: mitigate silently. No: brief attendees.
|
|
83
|
+
2. Communicate calmly — attendees follow the organizer's energy.
|
|
84
|
+
3. Log the issue in `.event_state.json` under `"incidents"` for post-event review.
|
|
85
|
+
4. Debrief within 24 hours — add to standard checklist if issue was preventable.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# D-Day Operations Checklist
|
|
2
|
+
|
|
3
|
+
> Event: {{EVENT_NAME}} {{EDITION}}회
|
|
4
|
+
> Date: {{DATE}} {{TIME}}
|
|
5
|
+
> Venue: {{VENUE}}
|
|
6
|
+
> Organizer on duty: {{ORGANIZER_NAME}}
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Morning (3+ Hours Before)
|
|
11
|
+
|
|
12
|
+
- [ ] Day-of reminder SMS sent to all attendees ({{SEND_TIME}})
|
|
13
|
+
- [ ] Final headcount confirmed from registration system
|
|
14
|
+
- [ ] Nametag printouts packed and counted
|
|
15
|
+
- [ ] Equipment bag packed: extension cord, HDMI cable, adapters, markers
|
|
16
|
+
- [ ] Emergency contact list saved to phone: venue manager, co-organizer, speakers
|
|
17
|
+
|
|
18
|
+
## Setup (60 Minutes Before)
|
|
19
|
+
|
|
20
|
+
- [ ] Arrived at venue — venue manager contacted
|
|
21
|
+
- [ ] Room layout confirmed: seating, stage/podium position
|
|
22
|
+
- [ ] Projector / screen tested with presenter laptop
|
|
23
|
+
- [ ] Microphone(s) tested (wireless + backup)
|
|
24
|
+
- [ ] Zoom / streaming setup (if hybrid or webinar): audio, camera, screen share
|
|
25
|
+
- [ ] Nametag table set up at entrance with pens
|
|
26
|
+
- [ ] Slido QR code displayed (on screen + printed if offline)
|
|
27
|
+
- [ ] Refreshments/snacks arranged
|
|
28
|
+
|
|
29
|
+
## 30 Minutes Before
|
|
30
|
+
|
|
31
|
+
- [ ] Operational slides opened on presenter laptop, correct slide showing
|
|
32
|
+
- [ ] Speaker briefing completed: order, timing signals, Q&A format
|
|
33
|
+
- [ ] Camera / recording device positioned and recording started
|
|
34
|
+
- [ ] Greeting staff stationed at entrance
|
|
35
|
+
|
|
36
|
+
## During Event
|
|
37
|
+
|
|
38
|
+
- [ ] Doors open on time
|
|
39
|
+
- [ ] Late attendees directed without disrupting session
|
|
40
|
+
- [ ] Time signals given to speakers at 5 min and 1 min remaining
|
|
41
|
+
- [ ] Q&A moderated via Slido — top voted questions surfaced first
|
|
42
|
+
- [ ] Attendance count recorded at peak (for settlement)
|
|
43
|
+
|
|
44
|
+
## Wrap-Up
|
|
45
|
+
|
|
46
|
+
- [ ] Thank speakers on stage
|
|
47
|
+
- [ ] Announce next event (date or "stay tuned")
|
|
48
|
+
- [ ] Networking time opened
|
|
49
|
+
- [ ] Recording stopped — file saved to correct directory
|
|
50
|
+
- [ ] Photo assets organized: `output/images/{{EVENT_ID}}_dday/`
|
|
51
|
+
|
|
52
|
+
## Post-Event (Within 30 Minutes)
|
|
53
|
+
|
|
54
|
+
- [ ] Venue cleaned and returned to original state
|
|
55
|
+
- [ ] Lost items checked — contact info taken if needed
|
|
56
|
+
- [ ] Equipment collected and accounted for
|
|
57
|
+
- [ ] Venue manager check-out completed
|
|
58
|
+
- [ ] Quick debrief with co-organizers: what went well / what to fix
|
|
59
|
+
|
|
60
|
+
## Settlement Inputs to Collect Today
|
|
61
|
+
|
|
62
|
+
- [ ] Actual attendance count recorded
|
|
63
|
+
- [ ] All receipts collected: venue, snacks, gifts
|
|
64
|
+
- [ ] Cash / transfer payment records (if applicable)
|
|
65
|
+
- [ ] Notes on any unexpected expenses
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Event Timeline Checklist
|
|
2
|
+
|
|
3
|
+
## D-30 (One Month Out)
|
|
4
|
+
|
|
5
|
+
- [ ] Event date, time, and venue confirmed and locked
|
|
6
|
+
- [ ] Speaker lineup finalized (all confirmed in writing)
|
|
7
|
+
- [ ] Session topics confirmed with each speaker
|
|
8
|
+
- [ ] Registration page live with accurate details
|
|
9
|
+
- [ ] SNS promo post published (LinkedIn + Threads)
|
|
10
|
+
- [ ] Initial SMS notification sent to subscriber list
|
|
11
|
+
- [ ] Event state file created: `.event_state.json`
|
|
12
|
+
|
|
13
|
+
## D-14 (Two Weeks Out)
|
|
14
|
+
|
|
15
|
+
- [ ] Reminder SNS post published with urgency ("X spots remaining")
|
|
16
|
+
- [ ] Registration count reviewed — waitlist if oversubscribed
|
|
17
|
+
- [ ] Venue logistics confirmed: A/V, seating, catering order placed
|
|
18
|
+
- [ ] Operational slides drafted (cover, timetable, speaker bios)
|
|
19
|
+
- [ ] Slido configuration planned and documented
|
|
20
|
+
|
|
21
|
+
## D-7 (One Week Out)
|
|
22
|
+
|
|
23
|
+
- [ ] Attendee list exported from registration system
|
|
24
|
+
- [ ] Confirmation email drafted (BCC, includes venue detail + timetable)
|
|
25
|
+
- [ ] Confirmation SMS drafted (no emoji — EUC-KR safe)
|
|
26
|
+
- [ ] Nametag HTML generated from attendee list
|
|
27
|
+
- [ ] Final speaker slide template shared with speakers
|
|
28
|
+
|
|
29
|
+
## D-3 (Three Days Out)
|
|
30
|
+
|
|
31
|
+
- [ ] Confirmation email sent to all registered attendees (BCC)
|
|
32
|
+
- [ ] Confirmation SMS sent to attendees with phone numbers
|
|
33
|
+
- [ ] Speakers reminded of time, venue, and slide submission deadline
|
|
34
|
+
- [ ] Catering/snacks order confirmed with supplier
|
|
35
|
+
|
|
36
|
+
## D-1 (Day Before)
|
|
37
|
+
|
|
38
|
+
- [ ] Nametags printed (A4, 8 per page, reviewed for accuracy)
|
|
39
|
+
- [ ] Operational slides finalized and test-presented
|
|
40
|
+
- [ ] Equipment checklist verified: screen, camera, tripod, mic, cables
|
|
41
|
+
- [ ] Reminder SMS sent to attendees
|
|
42
|
+
- [ ] Reminder SNS post published
|
|
43
|
+
- [ ] Venue access confirmed for setup time
|
|
44
|
+
- [ ] Emergency contacts noted (venue manager, co-organizer)
|
|
45
|
+
|
|
46
|
+
## D-Day (Event Day)
|
|
47
|
+
|
|
48
|
+
- [ ] Day-of reminder SMS sent (morning, 2–3 hours before)
|
|
49
|
+
- [ ] Arrive at venue 60 minutes before start time
|
|
50
|
+
- [ ] A/V equipment tested (mic, projector/screen, Zoom if hybrid)
|
|
51
|
+
- [ ] Nametag table set up at entrance
|
|
52
|
+
- [ ] Slido link configured and QR code printed/displayed
|
|
53
|
+
- [ ] Speaker briefing done before doors open
|
|
54
|
+
- [ ] Photographer / recording setup confirmed
|
|
55
|
+
|
|
56
|
+
## D+1 (Day After)
|
|
57
|
+
|
|
58
|
+
- [ ] Review post drafted and published on SNS (story + 3 insights)
|
|
59
|
+
- [ ] Attendee feedback collected (Slido export or separate survey)
|
|
60
|
+
- [ ] Settlement report drafted (revenue - expenses)
|
|
61
|
+
- [ ] Speaker thank-you messages sent
|
|
62
|
+
- [ ] Event state file marked complete
|
|
63
|
+
- [ ] Photo/video assets organized and backed up
|
|
64
|
+
|
|
65
|
+
## Absolute Rules (All Steps)
|
|
66
|
+
|
|
67
|
+
- Emails MUST use BCC — never expose attendee emails to each other
|
|
68
|
+
- SMS MUST NOT contain emoji (EUC-KR encoding risk)
|
|
69
|
+
- No actual send without user confirmation (draft first, confirm second)
|
|
70
|
+
- No Notion registration without dry_run first
|