@tienne/gestalt 0.98.0 → 0.100.0

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.
Files changed (175) hide show
  1. package/CLAUDE.md +2 -1
  2. package/README.md +3 -2
  3. package/dist/package.json +2 -2
  4. package/dist/plugin/research-sources/amplitude/SOURCE.md +28 -0
  5. package/dist/plugin/research-sources/app-store-reviews/SOURCE.md +25 -0
  6. package/dist/plugin/research-sources/app-store-search/SOURCE.md +25 -0
  7. package/dist/plugin/research-sources/tech-blog-search/SOURCE.md +27 -0
  8. package/dist/plugin/research-sources/uibowl/SOURCE.md +26 -0
  9. package/dist/plugin/research-sources/web-search/SOURCE.md +24 -0
  10. package/dist/plugin/skills/_shared/proactive-routing.md +5 -0
  11. package/dist/plugin/skills/architecture/SKILL.md +1 -1
  12. package/dist/plugin/skills/market-scan/SKILL.md +61 -0
  13. package/dist/plugin/skills/research/SKILL.md +438 -0
  14. package/dist/plugin/skills/research/references/design.md +938 -0
  15. package/dist/plugin/skills/research/references/output-template.md +366 -0
  16. package/dist/plugin/skills/research/scripts/pii-vision.swift +327 -0
  17. package/dist/plugin/skills/research/scripts/slide-extract.mjs +223 -0
  18. package/dist/plugin/skills/reverse-plan/SKILL.md +52 -0
  19. package/dist/plugin/skills/screen-ref/SKILL.md +63 -0
  20. package/dist/plugin/skills/ux-research/SKILL.md +51 -0
  21. package/dist/src/architecture/validator.d.ts +17 -1
  22. package/dist/src/architecture/validator.d.ts.map +1 -1
  23. package/dist/src/architecture/validator.js +61 -45
  24. package/dist/src/architecture/validator.js.map +1 -1
  25. package/dist/src/core/config.d.ts +17 -0
  26. package/dist/src/core/config.d.ts.map +1 -1
  27. package/dist/src/core/config.js +4 -0
  28. package/dist/src/core/config.js.map +1 -1
  29. package/dist/src/core/source-location.d.ts +32 -0
  30. package/dist/src/core/source-location.d.ts.map +1 -0
  31. package/dist/src/core/source-location.js +87 -0
  32. package/dist/src/core/source-location.js.map +1 -0
  33. package/dist/src/execute/orchestrators/evolution.d.ts +3 -1
  34. package/dist/src/execute/orchestrators/evolution.d.ts.map +1 -1
  35. package/dist/src/execute/orchestrators/evolution.js +4 -2
  36. package/dist/src/execute/orchestrators/evolution.js.map +1 -1
  37. package/dist/src/execute/orchestrators/execution.d.ts +3 -1
  38. package/dist/src/execute/orchestrators/execution.d.ts.map +1 -1
  39. package/dist/src/execute/orchestrators/execution.js +4 -2
  40. package/dist/src/execute/orchestrators/execution.js.map +1 -1
  41. package/dist/src/execute/passthrough-engine.d.ts +2 -1
  42. package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
  43. package/dist/src/execute/passthrough-engine.js +3 -3
  44. package/dist/src/execute/passthrough-engine.js.map +1 -1
  45. package/dist/src/execute/prompts.d.ts.map +1 -1
  46. package/dist/src/execute/prompts.js +20 -2
  47. package/dist/src/execute/prompts.js.map +1 -1
  48. package/dist/src/mcp/schemas.d.ts +93 -0
  49. package/dist/src/mcp/schemas.d.ts.map +1 -1
  50. package/dist/src/mcp/schemas.js +110 -0
  51. package/dist/src/mcp/schemas.js.map +1 -1
  52. package/dist/src/mcp/server.d.ts.map +1 -1
  53. package/dist/src/mcp/server.js +12 -2
  54. package/dist/src/mcp/server.js.map +1 -1
  55. package/dist/src/mcp/tools/execute/evaluate.js +1 -1
  56. package/dist/src/mcp/tools/execute/evaluate.js.map +1 -1
  57. package/dist/src/mcp/tools/research-passthrough.d.ts +21 -0
  58. package/dist/src/mcp/tools/research-passthrough.d.ts.map +1 -0
  59. package/dist/src/mcp/tools/research-passthrough.js +566 -0
  60. package/dist/src/mcp/tools/research-passthrough.js.map +1 -0
  61. package/dist/src/memory/project-memory-store.d.ts +7 -0
  62. package/dist/src/memory/project-memory-store.d.ts.map +1 -1
  63. package/dist/src/memory/project-memory-store.js +17 -0
  64. package/dist/src/memory/project-memory-store.js.map +1 -1
  65. package/dist/src/research/canvas-view.d.ts +5 -0
  66. package/dist/src/research/canvas-view.d.ts.map +1 -0
  67. package/dist/src/research/canvas-view.js +274 -0
  68. package/dist/src/research/canvas-view.js.map +1 -0
  69. package/dist/src/research/evidence.d.ts +145 -0
  70. package/dist/src/research/evidence.d.ts.map +1 -0
  71. package/dist/src/research/evidence.js +50 -0
  72. package/dist/src/research/evidence.js.map +1 -0
  73. package/dist/src/research/figma-plan.d.ts +80 -0
  74. package/dist/src/research/figma-plan.d.ts.map +1 -0
  75. package/dist/src/research/figma-plan.js +527 -0
  76. package/dist/src/research/figma-plan.js.map +1 -0
  77. package/dist/src/research/figma-script.d.ts +19 -0
  78. package/dist/src/research/figma-script.d.ts.map +1 -0
  79. package/dist/src/research/figma-script.js +363 -0
  80. package/dist/src/research/figma-script.js.map +1 -0
  81. package/dist/src/research/index.d.ts +8 -0
  82. package/dist/src/research/index.d.ts.map +1 -0
  83. package/dist/src/research/index.js +8 -0
  84. package/dist/src/research/index.js.map +1 -0
  85. package/dist/src/research/pii-core.d.ts +16 -0
  86. package/dist/src/research/pii-core.d.ts.map +1 -0
  87. package/dist/src/research/pii-core.js +345 -0
  88. package/dist/src/research/pii-core.js.map +1 -0
  89. package/dist/src/research/pii-dom.d.ts +13 -0
  90. package/dist/src/research/pii-dom.d.ts.map +1 -0
  91. package/dist/src/research/pii-dom.js +208 -0
  92. package/dist/src/research/pii-dom.js.map +1 -0
  93. package/dist/src/research/pii-image.d.ts +71 -0
  94. package/dist/src/research/pii-image.d.ts.map +1 -0
  95. package/dist/src/research/pii-image.js +163 -0
  96. package/dist/src/research/pii-image.js.map +1 -0
  97. package/dist/src/research/pii.d.ts +21 -0
  98. package/dist/src/research/pii.d.ts.map +1 -0
  99. package/dist/src/research/pii.js +47 -0
  100. package/dist/src/research/pii.js.map +1 -0
  101. package/dist/src/research/product-profile.d.ts +108 -0
  102. package/dist/src/research/product-profile.d.ts.map +1 -0
  103. package/dist/src/research/product-profile.js +104 -0
  104. package/dist/src/research/product-profile.js.map +1 -0
  105. package/dist/src/research/render-html.d.ts +203 -0
  106. package/dist/src/research/render-html.d.ts.map +1 -0
  107. package/dist/src/research/render-html.js +901 -0
  108. package/dist/src/research/render-html.js.map +1 -0
  109. package/dist/src/research/schema-base.d.ts +5 -0
  110. package/dist/src/research/schema-base.d.ts.map +1 -0
  111. package/dist/src/research/schema-base.js +10 -0
  112. package/dist/src/research/schema-base.js.map +1 -0
  113. package/dist/src/research/schema.d.ts +5142 -0
  114. package/dist/src/research/schema.d.ts.map +1 -0
  115. package/dist/src/research/schema.js +991 -0
  116. package/dist/src/research/schema.js.map +1 -0
  117. package/dist/src/research/source-create.d.ts +79 -0
  118. package/dist/src/research/source-create.d.ts.map +1 -0
  119. package/dist/src/research/source-create.js +226 -0
  120. package/dist/src/research/source-create.js.map +1 -0
  121. package/dist/src/research/source-registry.d.ts +29 -0
  122. package/dist/src/research/source-registry.d.ts.map +1 -0
  123. package/dist/src/research/source-registry.js +74 -0
  124. package/dist/src/research/source-registry.js.map +1 -0
  125. package/dist/src/research/source-schema.d.ts +158 -0
  126. package/dist/src/research/source-schema.d.ts.map +1 -0
  127. package/dist/src/research/source-schema.js +215 -0
  128. package/dist/src/research/source-schema.js.map +1 -0
  129. package/dist/src/research/source-status.d.ts +40 -0
  130. package/dist/src/research/source-status.d.ts.map +1 -0
  131. package/dist/src/research/source-status.js +109 -0
  132. package/dist/src/research/source-status.js.map +1 -0
  133. package/dist/src/research/store.d.ts +24 -0
  134. package/dist/src/research/store.d.ts.map +1 -0
  135. package/dist/src/research/store.js +60 -0
  136. package/dist/src/research/store.js.map +1 -0
  137. package/dist/src/research/target-view.d.ts +33 -0
  138. package/dist/src/research/target-view.d.ts.map +1 -0
  139. package/dist/src/research/target-view.js +133 -0
  140. package/dist/src/research/target-view.js.map +1 -0
  141. package/dist/src/research/target.d.ts +883 -0
  142. package/dist/src/research/target.d.ts.map +1 -0
  143. package/dist/src/research/target.js +323 -0
  144. package/dist/src/research/target.js.map +1 -0
  145. package/dist/src/research/video-transfer.d.ts +28 -0
  146. package/dist/src/research/video-transfer.d.ts.map +1 -0
  147. package/dist/src/research/video-transfer.js +100 -0
  148. package/dist/src/research/video-transfer.js.map +1 -0
  149. package/dist/src/spec/generator.d.ts.map +1 -1
  150. package/dist/src/spec/generator.js +3 -2
  151. package/dist/src/spec/generator.js.map +1 -1
  152. package/dist/src/spec/passthrough-generator.d.ts.map +1 -1
  153. package/dist/src/spec/passthrough-generator.js +6 -4
  154. package/dist/src/spec/passthrough-generator.js.map +1 -1
  155. package/package.json +2 -2
  156. package/plugin/.codex-plugin/plugin.json +1 -1
  157. package/plugin/.mcp.json +1 -1
  158. package/plugin/mcp.json +1 -1
  159. package/plugin/research-sources/amplitude/SOURCE.md +28 -0
  160. package/plugin/research-sources/app-store-reviews/SOURCE.md +25 -0
  161. package/plugin/research-sources/app-store-search/SOURCE.md +25 -0
  162. package/plugin/research-sources/tech-blog-search/SOURCE.md +27 -0
  163. package/plugin/research-sources/uibowl/SOURCE.md +26 -0
  164. package/plugin/research-sources/web-search/SOURCE.md +24 -0
  165. package/plugin/skills/_shared/proactive-routing.md +5 -0
  166. package/plugin/skills/architecture/SKILL.md +1 -1
  167. package/plugin/skills/market-scan/SKILL.md +61 -0
  168. package/plugin/skills/research/SKILL.md +438 -0
  169. package/plugin/skills/research/references/design.md +938 -0
  170. package/plugin/skills/research/references/output-template.md +366 -0
  171. package/plugin/skills/research/scripts/pii-vision.swift +327 -0
  172. package/plugin/skills/research/scripts/slide-extract.mjs +223 -0
  173. package/plugin/skills/reverse-plan/SKILL.md +52 -0
  174. package/plugin/skills/screen-ref/SKILL.md +63 -0
  175. package/plugin/skills/ux-research/SKILL.md +51 -0
@@ -0,0 +1,883 @@
1
+ import { z } from 'zod';
2
+ import type { Research, ResearchWarning } from './schema.js';
3
+ /** improve: 이미 있는 화면을 고친다. new: 아직 없는 화면이라 기준값을 비슷한 퍼널에서 빌려온다 */
4
+ export declare const TARGET_MODES: readonly ["improve", "new"];
5
+ /** 목표치 계산 한 단계가 어디서 온 숫자인지. 위에 있을수록 믿을 만하다 */
6
+ export declare const TARGET_STEP_METHODS: readonly ["internal", "proxy", "business", "market", "case", "assumption"];
7
+ export declare const TRACKING_STATUSES: readonly ["exists", "missing", "planned"];
8
+ export declare const LIFT_METHOD_LABEL: {
9
+ readonly experiment: "우리 지난 실험";
10
+ readonly case: "타사 사례";
11
+ readonly market: "시장 자료";
12
+ readonly assumption: "가정";
13
+ };
14
+ export declare const SHORTFALL_DECISION_LABEL: {
15
+ readonly 'add-hypotheses': "가설 추가";
16
+ readonly 'swap-hypotheses': "효과 큰 가설로 교체";
17
+ readonly 'lower-target': "목표 낮춤";
18
+ readonly keep: "그대로 둠";
19
+ };
20
+ export declare const DATA_SOURCE_KINDS: readonly ["amplitude", "export"];
21
+ /** 가설 기대 효과가 어디서 온 값인지. 위에 있을수록 믿을 만하다 */
22
+ export declare const LIFT_METHODS: readonly ["experiment", "case", "market", "assumption"];
23
+ /** 가설을 다 성공해도 목표에 못 닿을 때 사용자와 고르는 대응 */
24
+ export declare const SHORTFALL_DECISIONS: readonly ["add-hypotheses", "swap-hypotheses", "lower-target", "keep"];
25
+ export declare const looksLikeKey: (s: string) => boolean;
26
+ export declare const KEY_MESSAGE = "\uD0A4\uCC98\uB7FC \uBCF4\uC774\uB294 \uAC12\uC740 \uC801\uC9C0 \uC54A\uB294\uB2E4. \uD0A4\uAC00 \uC788\uB294 \uD30C\uC77C \uACBD\uB85C\uB9CC \uC801\uB294\uB2E4";
27
+ /** 가설의 기대 효과(expectedLiftPp)가 어디서 왔는지. 표본과 목표 도달 계산이 전부 이 값에서 나온다 */
28
+ export declare const liftBasisSchema: z.ZodEffects<z.ZodObject<{
29
+ basis: z.ZodEnum<["observation", "company-statement", "interpretation", "unconfirmed", "absent"]>;
30
+ evidence: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
31
+ type: z.ZodLiteral<"capture">;
32
+ captureId: z.ZodString;
33
+ }, "strip", z.ZodTypeAny, {
34
+ type: "capture";
35
+ captureId: string;
36
+ }, {
37
+ type: "capture";
38
+ captureId: string;
39
+ }>, z.ZodObject<{
40
+ type: z.ZodLiteral<"video">;
41
+ clipId: z.ZodString;
42
+ at: z.ZodNumber;
43
+ }, "strip", z.ZodTypeAny, {
44
+ at: number;
45
+ type: "video";
46
+ clipId: string;
47
+ }, {
48
+ at: number;
49
+ type: "video";
50
+ clipId: string;
51
+ }>, z.ZodObject<{
52
+ type: z.ZodLiteral<"internal">;
53
+ source: z.ZodString;
54
+ }, "strip", z.ZodTypeAny, {
55
+ type: "internal";
56
+ source: string;
57
+ }, {
58
+ type: "internal";
59
+ source: string;
60
+ }>, z.ZodObject<{
61
+ type: z.ZodLiteral<"url">;
62
+ url: z.ZodEffects<z.ZodString, string, string>;
63
+ }, "strip", z.ZodTypeAny, {
64
+ type: "url";
65
+ url: string;
66
+ }, {
67
+ type: "url";
68
+ url: string;
69
+ }>]>, "many">>;
70
+ note: z.ZodOptional<z.ZodString>;
71
+ method: z.ZodEnum<["experiment", "case", "market", "assumption"]>;
72
+ }, "strip", z.ZodTypeAny, {
73
+ evidence: ({
74
+ type: "capture";
75
+ captureId: string;
76
+ } | {
77
+ at: number;
78
+ type: "video";
79
+ clipId: string;
80
+ } | {
81
+ type: "internal";
82
+ source: string;
83
+ } | {
84
+ type: "url";
85
+ url: string;
86
+ })[];
87
+ method: "market" | "case" | "assumption" | "experiment";
88
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
89
+ note?: string | undefined;
90
+ }, {
91
+ method: "market" | "case" | "assumption" | "experiment";
92
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
93
+ note?: string | undefined;
94
+ evidence?: ({
95
+ type: "capture";
96
+ captureId: string;
97
+ } | {
98
+ at: number;
99
+ type: "video";
100
+ clipId: string;
101
+ } | {
102
+ type: "internal";
103
+ source: string;
104
+ } | {
105
+ type: "url";
106
+ url: string;
107
+ })[] | undefined;
108
+ }>, {
109
+ evidence: ({
110
+ type: "capture";
111
+ captureId: string;
112
+ } | {
113
+ at: number;
114
+ type: "video";
115
+ clipId: string;
116
+ } | {
117
+ type: "internal";
118
+ source: string;
119
+ } | {
120
+ type: "url";
121
+ url: string;
122
+ })[];
123
+ method: "market" | "case" | "assumption" | "experiment";
124
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
125
+ note?: string | undefined;
126
+ }, {
127
+ method: "market" | "case" | "assumption" | "experiment";
128
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
129
+ note?: string | undefined;
130
+ evidence?: ({
131
+ type: "capture";
132
+ captureId: string;
133
+ } | {
134
+ at: number;
135
+ type: "video";
136
+ clipId: string;
137
+ } | {
138
+ type: "internal";
139
+ source: string;
140
+ } | {
141
+ type: "url";
142
+ url: string;
143
+ })[] | undefined;
144
+ }>;
145
+ export declare const targetSchema: z.ZodObject<{
146
+ mode: z.ZodEnum<["improve", "new"]>;
147
+ metric: z.ZodObject<{
148
+ name: z.ZodString;
149
+ numerator: z.ZodString;
150
+ denominator: z.ZodString;
151
+ }, "strip", z.ZodTypeAny, {
152
+ name: string;
153
+ numerator: string;
154
+ denominator: string;
155
+ }, {
156
+ name: string;
157
+ numerator: string;
158
+ denominator: string;
159
+ }>;
160
+ baseline: z.ZodEffects<z.ZodObject<{
161
+ basis: z.ZodEnum<["observation", "company-statement", "interpretation", "unconfirmed", "absent"]>;
162
+ evidence: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
163
+ type: z.ZodLiteral<"capture">;
164
+ captureId: z.ZodString;
165
+ }, "strip", z.ZodTypeAny, {
166
+ type: "capture";
167
+ captureId: string;
168
+ }, {
169
+ type: "capture";
170
+ captureId: string;
171
+ }>, z.ZodObject<{
172
+ type: z.ZodLiteral<"video">;
173
+ clipId: z.ZodString;
174
+ at: z.ZodNumber;
175
+ }, "strip", z.ZodTypeAny, {
176
+ at: number;
177
+ type: "video";
178
+ clipId: string;
179
+ }, {
180
+ at: number;
181
+ type: "video";
182
+ clipId: string;
183
+ }>, z.ZodObject<{
184
+ type: z.ZodLiteral<"internal">;
185
+ source: z.ZodString;
186
+ }, "strip", z.ZodTypeAny, {
187
+ type: "internal";
188
+ source: string;
189
+ }, {
190
+ type: "internal";
191
+ source: string;
192
+ }>, z.ZodObject<{
193
+ type: z.ZodLiteral<"url">;
194
+ url: z.ZodEffects<z.ZodString, string, string>;
195
+ }, "strip", z.ZodTypeAny, {
196
+ type: "url";
197
+ url: string;
198
+ }, {
199
+ type: "url";
200
+ url: string;
201
+ }>]>, "many">>;
202
+ note: z.ZodOptional<z.ZodString>;
203
+ /** 지금 값(%). 못 구했으면 비우고 basis를 unconfirmed로 둔다 */
204
+ valuePct: z.ZodOptional<z.ZodNumber>;
205
+ /** 어느 기간의 값인지. 예: "2026-08-01부터 2026-09-25까지 8주" */
206
+ period: z.ZodString;
207
+ /** 신규 화면이라 대신 쓴 기존 퍼널. 예: "포인트 충전 진입 대비 결제 완료" */
208
+ proxyOf: z.ZodOptional<z.ZodString>;
209
+ }, "strip", z.ZodTypeAny, {
210
+ evidence: ({
211
+ type: "capture";
212
+ captureId: string;
213
+ } | {
214
+ at: number;
215
+ type: "video";
216
+ clipId: string;
217
+ } | {
218
+ type: "internal";
219
+ source: string;
220
+ } | {
221
+ type: "url";
222
+ url: string;
223
+ })[];
224
+ period: string;
225
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
226
+ note?: string | undefined;
227
+ valuePct?: number | undefined;
228
+ proxyOf?: string | undefined;
229
+ }, {
230
+ period: string;
231
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
232
+ note?: string | undefined;
233
+ evidence?: ({
234
+ type: "capture";
235
+ captureId: string;
236
+ } | {
237
+ at: number;
238
+ type: "video";
239
+ clipId: string;
240
+ } | {
241
+ type: "internal";
242
+ source: string;
243
+ } | {
244
+ type: "url";
245
+ url: string;
246
+ })[] | undefined;
247
+ valuePct?: number | undefined;
248
+ proxyOf?: string | undefined;
249
+ }>, {
250
+ evidence: ({
251
+ type: "capture";
252
+ captureId: string;
253
+ } | {
254
+ at: number;
255
+ type: "video";
256
+ clipId: string;
257
+ } | {
258
+ type: "internal";
259
+ source: string;
260
+ } | {
261
+ type: "url";
262
+ url: string;
263
+ })[];
264
+ period: string;
265
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
266
+ note?: string | undefined;
267
+ valuePct?: number | undefined;
268
+ proxyOf?: string | undefined;
269
+ }, {
270
+ period: string;
271
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
272
+ note?: string | undefined;
273
+ evidence?: ({
274
+ type: "capture";
275
+ captureId: string;
276
+ } | {
277
+ at: number;
278
+ type: "video";
279
+ clipId: string;
280
+ } | {
281
+ type: "internal";
282
+ source: string;
283
+ } | {
284
+ type: "url";
285
+ url: string;
286
+ })[] | undefined;
287
+ valuePct?: number | undefined;
288
+ proxyOf?: string | undefined;
289
+ }>;
290
+ dailyEntrants: z.ZodOptional<z.ZodEffects<z.ZodObject<{
291
+ basis: z.ZodEnum<["observation", "company-statement", "interpretation", "unconfirmed", "absent"]>;
292
+ evidence: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
293
+ type: z.ZodLiteral<"capture">;
294
+ captureId: z.ZodString;
295
+ }, "strip", z.ZodTypeAny, {
296
+ type: "capture";
297
+ captureId: string;
298
+ }, {
299
+ type: "capture";
300
+ captureId: string;
301
+ }>, z.ZodObject<{
302
+ type: z.ZodLiteral<"video">;
303
+ clipId: z.ZodString;
304
+ at: z.ZodNumber;
305
+ }, "strip", z.ZodTypeAny, {
306
+ at: number;
307
+ type: "video";
308
+ clipId: string;
309
+ }, {
310
+ at: number;
311
+ type: "video";
312
+ clipId: string;
313
+ }>, z.ZodObject<{
314
+ type: z.ZodLiteral<"internal">;
315
+ source: z.ZodString;
316
+ }, "strip", z.ZodTypeAny, {
317
+ type: "internal";
318
+ source: string;
319
+ }, {
320
+ type: "internal";
321
+ source: string;
322
+ }>, z.ZodObject<{
323
+ type: z.ZodLiteral<"url">;
324
+ url: z.ZodEffects<z.ZodString, string, string>;
325
+ }, "strip", z.ZodTypeAny, {
326
+ type: "url";
327
+ url: string;
328
+ }, {
329
+ type: "url";
330
+ url: string;
331
+ }>]>, "many">>;
332
+ note: z.ZodOptional<z.ZodString>;
333
+ /** 분모에 들어오는 하루 사람 수 */
334
+ value: z.ZodNumber;
335
+ /** 신규 화면이면 어떻게 추정했는지. 예: "마이 탭 하루 조회 6만 × 비슷한 배너 클릭률 7%" */
336
+ derivation: z.ZodOptional<z.ZodString>;
337
+ }, "strip", z.ZodTypeAny, {
338
+ value: number;
339
+ evidence: ({
340
+ type: "capture";
341
+ captureId: string;
342
+ } | {
343
+ at: number;
344
+ type: "video";
345
+ clipId: string;
346
+ } | {
347
+ type: "internal";
348
+ source: string;
349
+ } | {
350
+ type: "url";
351
+ url: string;
352
+ })[];
353
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
354
+ note?: string | undefined;
355
+ derivation?: string | undefined;
356
+ }, {
357
+ value: number;
358
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
359
+ note?: string | undefined;
360
+ evidence?: ({
361
+ type: "capture";
362
+ captureId: string;
363
+ } | {
364
+ at: number;
365
+ type: "video";
366
+ clipId: string;
367
+ } | {
368
+ type: "internal";
369
+ source: string;
370
+ } | {
371
+ type: "url";
372
+ url: string;
373
+ })[] | undefined;
374
+ derivation?: string | undefined;
375
+ }>, {
376
+ value: number;
377
+ evidence: ({
378
+ type: "capture";
379
+ captureId: string;
380
+ } | {
381
+ at: number;
382
+ type: "video";
383
+ clipId: string;
384
+ } | {
385
+ type: "internal";
386
+ source: string;
387
+ } | {
388
+ type: "url";
389
+ url: string;
390
+ })[];
391
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
392
+ note?: string | undefined;
393
+ derivation?: string | undefined;
394
+ }, {
395
+ value: number;
396
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
397
+ note?: string | undefined;
398
+ evidence?: ({
399
+ type: "capture";
400
+ captureId: string;
401
+ } | {
402
+ at: number;
403
+ type: "video";
404
+ clipId: string;
405
+ } | {
406
+ type: "internal";
407
+ source: string;
408
+ } | {
409
+ type: "url";
410
+ url: string;
411
+ })[] | undefined;
412
+ derivation?: string | undefined;
413
+ }>>;
414
+ /** 주마다 출렁이는 폭(%p). 이보다 작은 효과는 실험 없이는 안 보인다 */
415
+ weeklySpreadPp: z.ZodOptional<z.ZodNumber>;
416
+ /** 아무것도 안 해도 목표 시점까지 움직일 몫(%p). 내려가면 음수 */
417
+ trendPp: z.ZodOptional<z.ZodNumber>;
418
+ range: z.ZodOptional<z.ZodEffects<z.ZodObject<{
419
+ conservativePct: z.ZodNumber;
420
+ expectedPct: z.ZodNumber;
421
+ stretchPct: z.ZodNumber;
422
+ }, "strip", z.ZodTypeAny, {
423
+ conservativePct: number;
424
+ expectedPct: number;
425
+ stretchPct: number;
426
+ }, {
427
+ conservativePct: number;
428
+ expectedPct: number;
429
+ stretchPct: number;
430
+ }>, {
431
+ conservativePct: number;
432
+ expectedPct: number;
433
+ stretchPct: number;
434
+ }, {
435
+ conservativePct: number;
436
+ expectedPct: number;
437
+ stretchPct: number;
438
+ }>>;
439
+ steps: z.ZodDefault<z.ZodArray<z.ZodEffects<z.ZodObject<{
440
+ basis: z.ZodEnum<["observation", "company-statement", "interpretation", "unconfirmed", "absent"]>;
441
+ evidence: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
442
+ type: z.ZodLiteral<"capture">;
443
+ captureId: z.ZodString;
444
+ }, "strip", z.ZodTypeAny, {
445
+ type: "capture";
446
+ captureId: string;
447
+ }, {
448
+ type: "capture";
449
+ captureId: string;
450
+ }>, z.ZodObject<{
451
+ type: z.ZodLiteral<"video">;
452
+ clipId: z.ZodString;
453
+ at: z.ZodNumber;
454
+ }, "strip", z.ZodTypeAny, {
455
+ at: number;
456
+ type: "video";
457
+ clipId: string;
458
+ }, {
459
+ at: number;
460
+ type: "video";
461
+ clipId: string;
462
+ }>, z.ZodObject<{
463
+ type: z.ZodLiteral<"internal">;
464
+ source: z.ZodString;
465
+ }, "strip", z.ZodTypeAny, {
466
+ type: "internal";
467
+ source: string;
468
+ }, {
469
+ type: "internal";
470
+ source: string;
471
+ }>, z.ZodObject<{
472
+ type: z.ZodLiteral<"url">;
473
+ url: z.ZodEffects<z.ZodString, string, string>;
474
+ }, "strip", z.ZodTypeAny, {
475
+ type: "url";
476
+ url: string;
477
+ }, {
478
+ type: "url";
479
+ url: string;
480
+ }>]>, "many">>;
481
+ note: z.ZodOptional<z.ZodString>;
482
+ id: z.ZodString;
483
+ label: z.ZodString;
484
+ /** 값과 단위를 같이. 예: "하루 4,200명" */
485
+ value: z.ZodString;
486
+ method: z.ZodEnum<["internal", "proxy", "business", "market", "case", "assumption"]>;
487
+ }, "strip", z.ZodTypeAny, {
488
+ value: string;
489
+ id: string;
490
+ evidence: ({
491
+ type: "capture";
492
+ captureId: string;
493
+ } | {
494
+ at: number;
495
+ type: "video";
496
+ clipId: string;
497
+ } | {
498
+ type: "internal";
499
+ source: string;
500
+ } | {
501
+ type: "url";
502
+ url: string;
503
+ })[];
504
+ method: "internal" | "proxy" | "business" | "market" | "case" | "assumption";
505
+ label: string;
506
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
507
+ note?: string | undefined;
508
+ }, {
509
+ value: string;
510
+ id: string;
511
+ method: "internal" | "proxy" | "business" | "market" | "case" | "assumption";
512
+ label: string;
513
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
514
+ note?: string | undefined;
515
+ evidence?: ({
516
+ type: "capture";
517
+ captureId: string;
518
+ } | {
519
+ at: number;
520
+ type: "video";
521
+ clipId: string;
522
+ } | {
523
+ type: "internal";
524
+ source: string;
525
+ } | {
526
+ type: "url";
527
+ url: string;
528
+ })[] | undefined;
529
+ }>, {
530
+ value: string;
531
+ id: string;
532
+ evidence: ({
533
+ type: "capture";
534
+ captureId: string;
535
+ } | {
536
+ at: number;
537
+ type: "video";
538
+ clipId: string;
539
+ } | {
540
+ type: "internal";
541
+ source: string;
542
+ } | {
543
+ type: "url";
544
+ url: string;
545
+ })[];
546
+ method: "internal" | "proxy" | "business" | "market" | "case" | "assumption";
547
+ label: string;
548
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
549
+ note?: string | undefined;
550
+ }, {
551
+ value: string;
552
+ id: string;
553
+ method: "internal" | "proxy" | "business" | "market" | "case" | "assumption";
554
+ label: string;
555
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
556
+ note?: string | undefined;
557
+ evidence?: ({
558
+ type: "capture";
559
+ captureId: string;
560
+ } | {
561
+ at: number;
562
+ type: "video";
563
+ clipId: string;
564
+ } | {
565
+ type: "internal";
566
+ source: string;
567
+ } | {
568
+ type: "url";
569
+ url: string;
570
+ })[] | undefined;
571
+ }>, "many">>;
572
+ dataSource: z.ZodOptional<z.ZodObject<{
573
+ kind: z.ZodEnum<["amplitude", "export"]>;
574
+ /** 프로젝트 이름. 키는 적지 않는다 */
575
+ project: z.ZodEffects<z.ZodString, string, string>;
576
+ /** 같은 숫자를 다시 볼 수 있는 저장된 차트 */
577
+ chartUrl: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
578
+ /** 퍼널 단계마다 쓴 이벤트 */
579
+ events: z.ZodDefault<z.ZodArray<z.ZodObject<{
580
+ step: z.ZodString;
581
+ event: z.ZodString;
582
+ }, "strip", z.ZodTypeAny, {
583
+ step: string;
584
+ event: string;
585
+ }, {
586
+ step: string;
587
+ event: string;
588
+ }>, "many">>;
589
+ from: z.ZodString;
590
+ to: z.ZodString;
591
+ }, "strip", z.ZodTypeAny, {
592
+ events: {
593
+ step: string;
594
+ event: string;
595
+ }[];
596
+ kind: "amplitude" | "export";
597
+ from: string;
598
+ to: string;
599
+ project: string;
600
+ chartUrl?: string | undefined;
601
+ }, {
602
+ kind: "amplitude" | "export";
603
+ from: string;
604
+ to: string;
605
+ project: string;
606
+ events?: {
607
+ step: string;
608
+ event: string;
609
+ }[] | undefined;
610
+ chartUrl?: string | undefined;
611
+ }>>;
612
+ /** 가설을 재는 데 필요한 이벤트. 신규 화면이면 심어야 할 목록이 된다 */
613
+ trackingPlan: z.ZodDefault<z.ZodArray<z.ZodObject<{
614
+ event: z.ZodString;
615
+ /** 퍼널의 어느 단계를 재는지 */
616
+ step: z.ZodString;
617
+ status: z.ZodEnum<["exists", "missing", "planned"]>;
618
+ note: z.ZodOptional<z.ZodString>;
619
+ }, "strip", z.ZodTypeAny, {
620
+ status: "missing" | "exists" | "planned";
621
+ step: string;
622
+ event: string;
623
+ note?: string | undefined;
624
+ }, {
625
+ status: "missing" | "exists" | "planned";
626
+ step: string;
627
+ event: string;
628
+ note?: string | undefined;
629
+ }>, "many">>;
630
+ /** 가설을 다 성공해도 기대 목표에 못 닿았을 때 사용자와 고른 대응 */
631
+ shortfall: z.ZodOptional<z.ZodEffects<z.ZodObject<{
632
+ decision: z.ZodEnum<["add-hypotheses", "swap-hypotheses", "lower-target", "keep"]>;
633
+ /** 목표를 낮췄으면 처음 기대 목표(%) */
634
+ originalExpectedPct: z.ZodOptional<z.ZodNumber>;
635
+ /** 누가 왜 그렇게 정했는지 */
636
+ note: z.ZodString;
637
+ }, "strip", z.ZodTypeAny, {
638
+ note: string;
639
+ decision: "keep" | "add-hypotheses" | "swap-hypotheses" | "lower-target";
640
+ originalExpectedPct?: number | undefined;
641
+ }, {
642
+ note: string;
643
+ decision: "keep" | "add-hypotheses" | "swap-hypotheses" | "lower-target";
644
+ originalExpectedPct?: number | undefined;
645
+ }>, {
646
+ note: string;
647
+ decision: "keep" | "add-hypotheses" | "swap-hypotheses" | "lower-target";
648
+ originalExpectedPct?: number | undefined;
649
+ }, {
650
+ note: string;
651
+ decision: "keep" | "add-hypotheses" | "swap-hypotheses" | "lower-target";
652
+ originalExpectedPct?: number | undefined;
653
+ }>>;
654
+ }, "strip", z.ZodTypeAny, {
655
+ mode: "improve" | "new";
656
+ baseline: {
657
+ evidence: ({
658
+ type: "capture";
659
+ captureId: string;
660
+ } | {
661
+ at: number;
662
+ type: "video";
663
+ clipId: string;
664
+ } | {
665
+ type: "internal";
666
+ source: string;
667
+ } | {
668
+ type: "url";
669
+ url: string;
670
+ })[];
671
+ period: string;
672
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
673
+ note?: string | undefined;
674
+ valuePct?: number | undefined;
675
+ proxyOf?: string | undefined;
676
+ };
677
+ metric: {
678
+ name: string;
679
+ numerator: string;
680
+ denominator: string;
681
+ };
682
+ steps: {
683
+ value: string;
684
+ id: string;
685
+ evidence: ({
686
+ type: "capture";
687
+ captureId: string;
688
+ } | {
689
+ at: number;
690
+ type: "video";
691
+ clipId: string;
692
+ } | {
693
+ type: "internal";
694
+ source: string;
695
+ } | {
696
+ type: "url";
697
+ url: string;
698
+ })[];
699
+ method: "internal" | "proxy" | "business" | "market" | "case" | "assumption";
700
+ label: string;
701
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
702
+ note?: string | undefined;
703
+ }[];
704
+ trackingPlan: {
705
+ status: "missing" | "exists" | "planned";
706
+ step: string;
707
+ event: string;
708
+ note?: string | undefined;
709
+ }[];
710
+ dailyEntrants?: {
711
+ value: number;
712
+ evidence: ({
713
+ type: "capture";
714
+ captureId: string;
715
+ } | {
716
+ at: number;
717
+ type: "video";
718
+ clipId: string;
719
+ } | {
720
+ type: "internal";
721
+ source: string;
722
+ } | {
723
+ type: "url";
724
+ url: string;
725
+ })[];
726
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
727
+ note?: string | undefined;
728
+ derivation?: string | undefined;
729
+ } | undefined;
730
+ weeklySpreadPp?: number | undefined;
731
+ trendPp?: number | undefined;
732
+ range?: {
733
+ conservativePct: number;
734
+ expectedPct: number;
735
+ stretchPct: number;
736
+ } | undefined;
737
+ dataSource?: {
738
+ events: {
739
+ step: string;
740
+ event: string;
741
+ }[];
742
+ kind: "amplitude" | "export";
743
+ from: string;
744
+ to: string;
745
+ project: string;
746
+ chartUrl?: string | undefined;
747
+ } | undefined;
748
+ shortfall?: {
749
+ note: string;
750
+ decision: "keep" | "add-hypotheses" | "swap-hypotheses" | "lower-target";
751
+ originalExpectedPct?: number | undefined;
752
+ } | undefined;
753
+ }, {
754
+ mode: "improve" | "new";
755
+ baseline: {
756
+ period: string;
757
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
758
+ note?: string | undefined;
759
+ evidence?: ({
760
+ type: "capture";
761
+ captureId: string;
762
+ } | {
763
+ at: number;
764
+ type: "video";
765
+ clipId: string;
766
+ } | {
767
+ type: "internal";
768
+ source: string;
769
+ } | {
770
+ type: "url";
771
+ url: string;
772
+ })[] | undefined;
773
+ valuePct?: number | undefined;
774
+ proxyOf?: string | undefined;
775
+ };
776
+ metric: {
777
+ name: string;
778
+ numerator: string;
779
+ denominator: string;
780
+ };
781
+ steps?: {
782
+ value: string;
783
+ id: string;
784
+ method: "internal" | "proxy" | "business" | "market" | "case" | "assumption";
785
+ label: string;
786
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
787
+ note?: string | undefined;
788
+ evidence?: ({
789
+ type: "capture";
790
+ captureId: string;
791
+ } | {
792
+ at: number;
793
+ type: "video";
794
+ clipId: string;
795
+ } | {
796
+ type: "internal";
797
+ source: string;
798
+ } | {
799
+ type: "url";
800
+ url: string;
801
+ })[] | undefined;
802
+ }[] | undefined;
803
+ dailyEntrants?: {
804
+ value: number;
805
+ basis: "absent" | "observation" | "company-statement" | "interpretation" | "unconfirmed";
806
+ note?: string | undefined;
807
+ evidence?: ({
808
+ type: "capture";
809
+ captureId: string;
810
+ } | {
811
+ at: number;
812
+ type: "video";
813
+ clipId: string;
814
+ } | {
815
+ type: "internal";
816
+ source: string;
817
+ } | {
818
+ type: "url";
819
+ url: string;
820
+ })[] | undefined;
821
+ derivation?: string | undefined;
822
+ } | undefined;
823
+ weeklySpreadPp?: number | undefined;
824
+ trendPp?: number | undefined;
825
+ range?: {
826
+ conservativePct: number;
827
+ expectedPct: number;
828
+ stretchPct: number;
829
+ } | undefined;
830
+ dataSource?: {
831
+ kind: "amplitude" | "export";
832
+ from: string;
833
+ to: string;
834
+ project: string;
835
+ events?: {
836
+ step: string;
837
+ event: string;
838
+ }[] | undefined;
839
+ chartUrl?: string | undefined;
840
+ } | undefined;
841
+ trackingPlan?: {
842
+ status: "missing" | "exists" | "planned";
843
+ step: string;
844
+ event: string;
845
+ note?: string | undefined;
846
+ }[] | undefined;
847
+ shortfall?: {
848
+ note: string;
849
+ decision: "keep" | "add-hypotheses" | "swap-hypotheses" | "lower-target";
850
+ originalExpectedPct?: number | undefined;
851
+ } | undefined;
852
+ }>;
853
+ export type Target = z.infer<typeof targetSchema>;
854
+ /** 이보다 오래 걸리는 실험은 이 트래픽으로 못 가려낸다고 본다 */
855
+ export declare const MAX_TEST_DAYS = 56;
856
+ /** 기준 전환율 basePct에서 liftPp만큼 오른 걸 가려내는 데 필요한 군당 표본 */
857
+ export declare function requiredSamplePerArm(basePct: number, liftPp: number): number;
858
+ /** 군당 표본 n으로 가려낼 수 있는 가장 작은 효과(%p). 소수 첫째 자리까지 */
859
+ export declare function minDetectableLiftPp(basePct: number, nPerArm: number): number;
860
+ export declare function daysNeeded(nPerArm: number, dailyEntrants: number, arms?: number): number;
861
+ export interface LiftCoverage {
862
+ /** 기대 목표까지 시안으로 올려야 하는 몫(%p). 추세는 뺀다 */
863
+ neededPp: number;
864
+ /** 기대 효과가 적힌 가설의 합(%p) */
865
+ plannedPp: number;
866
+ /** 다 성공하면 닿는 값(%) */
867
+ reachPct: number;
868
+ }
869
+ /** 기대 효과가 하나도 없거나 기준값, 목표 범위가 없으면 계산하지 않는다 */
870
+ export declare function liftCoverage(research: Research): LiftCoverage | undefined;
871
+ export interface HypothesisPower {
872
+ index: number;
873
+ liftPp: number;
874
+ nPerArm: number;
875
+ /** 하루 진입 수가 없으면 비운다 */
876
+ days?: number;
877
+ }
878
+ /** 기대 효과가 적힌 가설마다 필요한 표본과 걸리는 일수 */
879
+ export declare function hypothesisPower(research: Research): HypothesisPower[];
880
+ /** 기준값을 실제 데이터로 채웠는지. 채웠으면 타사 사례는 교차 확인용으로 내려간다 */
881
+ export declare function hasUsableBaseline(research: Research): boolean;
882
+ export declare function lintTarget(research: Research, warnings: ResearchWarning[]): void;
883
+ //# sourceMappingURL=target.d.ts.map