@contractspec/lib.lifecycle 2.4.0 → 2.6.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.
@@ -1,3 +1,967 @@
1
+ // src/i18n/messages.ts
2
+ import {
3
+ createI18nFactory
4
+ } from "@contractspec/lib.contracts-spec/translations";
5
+
6
+ // src/i18n/catalogs/en.ts
7
+ import { defineTranslation } from "@contractspec/lib.contracts-spec/translations";
8
+ var enMessages = defineTranslation({
9
+ meta: {
10
+ key: "lifecycle.messages",
11
+ version: "1.0.0",
12
+ domain: "lifecycle",
13
+ description: "Display labels, stage metadata, and formatter strings for the lifecycle package",
14
+ owners: ["platform"],
15
+ stability: "experimental"
16
+ },
17
+ locale: "en",
18
+ fallback: "en",
19
+ messages: {
20
+ "stage.exploration.name": {
21
+ value: "Exploration / Ideation",
22
+ description: "Display name for the Exploration stage"
23
+ },
24
+ "stage.problemSolutionFit.name": {
25
+ value: "Problem–Solution Fit",
26
+ description: "Display name for the Problem-Solution Fit stage"
27
+ },
28
+ "stage.mvpEarlyTraction.name": {
29
+ value: "MVP & Early Traction",
30
+ description: "Display name for the MVP & Early Traction stage"
31
+ },
32
+ "stage.productMarketFit.name": {
33
+ value: "Product–Market Fit",
34
+ description: "Display name for the Product-Market Fit stage"
35
+ },
36
+ "stage.growthScaleUp.name": {
37
+ value: "Growth / Scale-up",
38
+ description: "Display name for the Growth / Scale-up stage"
39
+ },
40
+ "stage.expansionPlatform.name": {
41
+ value: "Expansion / Platform",
42
+ description: "Display name for the Expansion / Platform stage"
43
+ },
44
+ "stage.maturityRenewal.name": {
45
+ value: "Maturity / Renewal",
46
+ description: "Display name for the Maturity / Renewal stage"
47
+ },
48
+ "stage.exploration.question": {
49
+ value: "Is there a problem worth my time?",
50
+ description: "Key question for the Exploration stage"
51
+ },
52
+ "stage.problemSolutionFit.question": {
53
+ value: "Do people care enough about this solution?",
54
+ description: "Key question for the Problem-Solution Fit stage"
55
+ },
56
+ "stage.mvpEarlyTraction.question": {
57
+ value: "Can we get real usage and learn fast?",
58
+ description: "Key question for the MVP & Early Traction stage"
59
+ },
60
+ "stage.productMarketFit.question": {
61
+ value: "Is this pulling us forward?",
62
+ description: "Key question for the Product-Market Fit stage"
63
+ },
64
+ "stage.growthScaleUp.question": {
65
+ value: "Can we grow this repeatably?",
66
+ description: "Key question for the Growth / Scale-up stage"
67
+ },
68
+ "stage.expansionPlatform.question": {
69
+ value: "What is the next growth curve?",
70
+ description: "Key question for the Expansion / Platform stage"
71
+ },
72
+ "stage.maturityRenewal.question": {
73
+ value: "Optimize, reinvent, or sunset?",
74
+ description: "Key question for the Maturity / Renewal stage"
75
+ },
76
+ "stage.exploration.signal.0": {
77
+ value: "20+ discovery interviews",
78
+ description: "Signal for Exploration stage"
79
+ },
80
+ "stage.exploration.signal.1": {
81
+ value: "Clear problem statement",
82
+ description: "Signal for Exploration stage"
83
+ },
84
+ "stage.exploration.signal.2": {
85
+ value: "Named ICP",
86
+ description: "Signal for Exploration stage"
87
+ },
88
+ "stage.problemSolutionFit.signal.0": {
89
+ value: "Prototype reuse",
90
+ description: "Signal for Problem-Solution Fit stage"
91
+ },
92
+ "stage.problemSolutionFit.signal.1": {
93
+ value: "Referral energy",
94
+ description: "Signal for Problem-Solution Fit stage"
95
+ },
96
+ "stage.problemSolutionFit.signal.2": {
97
+ value: "Pre-pay interest",
98
+ description: "Signal for Problem-Solution Fit stage"
99
+ },
100
+ "stage.mvpEarlyTraction.signal.0": {
101
+ value: "20–50 named active users",
102
+ description: "Signal for MVP & Early Traction stage"
103
+ },
104
+ "stage.mvpEarlyTraction.signal.1": {
105
+ value: "Weekly releases",
106
+ description: "Signal for MVP & Early Traction stage"
107
+ },
108
+ "stage.mvpEarlyTraction.signal.2": {
109
+ value: "Noisy feedback",
110
+ description: "Signal for MVP & Early Traction stage"
111
+ },
112
+ "stage.productMarketFit.signal.0": {
113
+ value: "Retention without heroics",
114
+ description: "Signal for Product-Market Fit stage"
115
+ },
116
+ "stage.productMarketFit.signal.1": {
117
+ value: "Organic word-of-mouth",
118
+ description: "Signal for Product-Market Fit stage"
119
+ },
120
+ "stage.productMarketFit.signal.2": {
121
+ value: "Value stories",
122
+ description: "Signal for Product-Market Fit stage"
123
+ },
124
+ "stage.growthScaleUp.signal.0": {
125
+ value: "Predictable channels",
126
+ description: "Signal for Growth / Scale-up stage"
127
+ },
128
+ "stage.growthScaleUp.signal.1": {
129
+ value: "Specialized hires",
130
+ description: "Signal for Growth / Scale-up stage"
131
+ },
132
+ "stage.growthScaleUp.signal.2": {
133
+ value: "Unit economics on track",
134
+ description: "Signal for Growth / Scale-up stage"
135
+ },
136
+ "stage.expansionPlatform.signal.0": {
137
+ value: "Stable core metrics",
138
+ description: "Signal for Expansion / Platform stage"
139
+ },
140
+ "stage.expansionPlatform.signal.1": {
141
+ value: "Partner/API demand",
142
+ description: "Signal for Expansion / Platform stage"
143
+ },
144
+ "stage.expansionPlatform.signal.2": {
145
+ value: "Ecosystem pull",
146
+ description: "Signal for Expansion / Platform stage"
147
+ },
148
+ "stage.maturityRenewal.signal.0": {
149
+ value: "Margin focus",
150
+ description: "Signal for Maturity / Renewal stage"
151
+ },
152
+ "stage.maturityRenewal.signal.1": {
153
+ value: "Portfolio bets",
154
+ description: "Signal for Maturity / Renewal stage"
155
+ },
156
+ "stage.maturityRenewal.signal.2": {
157
+ value: "Narrative refresh",
158
+ description: "Signal for Maturity / Renewal stage"
159
+ },
160
+ "stage.exploration.trap.0": {
161
+ value: "Branding before discovery",
162
+ description: "Trap for Exploration stage"
163
+ },
164
+ "stage.exploration.trap.1": {
165
+ value: "Premature tooling decisions",
166
+ description: "Trap for Exploration stage"
167
+ },
168
+ "stage.problemSolutionFit.trap.0": {
169
+ value: "“Market is huge” without users",
170
+ description: "Trap for Problem-Solution Fit stage"
171
+ },
172
+ "stage.problemSolutionFit.trap.1": {
173
+ value: "Skipping qualitative loops",
174
+ description: "Trap for Problem-Solution Fit stage"
175
+ },
176
+ "stage.mvpEarlyTraction.trap.0": {
177
+ value: "Overbuilt infra for 10 users",
178
+ description: "Trap for MVP & Early Traction stage"
179
+ },
180
+ "stage.mvpEarlyTraction.trap.1": {
181
+ value: "Undefined retention metric",
182
+ description: "Trap for MVP & Early Traction stage"
183
+ },
184
+ "stage.productMarketFit.trap.0": {
185
+ value: "Hero growth that does not scale",
186
+ description: "Trap for Product-Market Fit stage"
187
+ },
188
+ "stage.productMarketFit.trap.1": {
189
+ value: "Ignoring churn signals",
190
+ description: "Trap for Product-Market Fit stage"
191
+ },
192
+ "stage.growthScaleUp.trap.0": {
193
+ value: "Paid spend masking retention gaps",
194
+ description: "Trap for Growth / Scale-up stage"
195
+ },
196
+ "stage.growthScaleUp.trap.1": {
197
+ value: "Infra debt blocking launches",
198
+ description: "Trap for Growth / Scale-up stage"
199
+ },
200
+ "stage.expansionPlatform.trap.0": {
201
+ value: "Platform theater before wedge is solid",
202
+ description: "Trap for Expansion / Platform stage"
203
+ },
204
+ "stage.maturityRenewal.trap.0": {
205
+ value: "Assuming past success is enough",
206
+ description: "Trap for Maturity / Renewal stage"
207
+ },
208
+ "stage.exploration.focus.0": {
209
+ value: "Customer discovery",
210
+ description: "Focus area for Exploration stage"
211
+ },
212
+ "stage.exploration.focus.1": {
213
+ value: "Problem definition",
214
+ description: "Focus area for Exploration stage"
215
+ },
216
+ "stage.exploration.focus.2": {
217
+ value: "Segment clarity",
218
+ description: "Focus area for Exploration stage"
219
+ },
220
+ "stage.problemSolutionFit.focus.0": {
221
+ value: "Solution hypothesis",
222
+ description: "Focus area for Problem-Solution Fit stage"
223
+ },
224
+ "stage.problemSolutionFit.focus.1": {
225
+ value: "Value messaging",
226
+ description: "Focus area for Problem-Solution Fit stage"
227
+ },
228
+ "stage.problemSolutionFit.focus.2": {
229
+ value: "Feedback capture",
230
+ description: "Focus area for Problem-Solution Fit stage"
231
+ },
232
+ "stage.mvpEarlyTraction.focus.0": {
233
+ value: "Activation",
234
+ description: "Focus area for MVP & Early Traction stage"
235
+ },
236
+ "stage.mvpEarlyTraction.focus.1": {
237
+ value: "Cohort tracking",
238
+ description: "Focus area for MVP & Early Traction stage"
239
+ },
240
+ "stage.mvpEarlyTraction.focus.2": {
241
+ value: "Feedback rituals",
242
+ description: "Focus area for MVP & Early Traction stage"
243
+ },
244
+ "stage.productMarketFit.focus.0": {
245
+ value: "Retention",
246
+ description: "Focus area for Product-Market Fit stage"
247
+ },
248
+ "stage.productMarketFit.focus.1": {
249
+ value: "Reliability",
250
+ description: "Focus area for Product-Market Fit stage"
251
+ },
252
+ "stage.productMarketFit.focus.2": {
253
+ value: "ICP clarity",
254
+ description: "Focus area for Product-Market Fit stage"
255
+ },
256
+ "stage.growthScaleUp.focus.0": {
257
+ value: "Ops systems",
258
+ description: "Focus area for Growth / Scale-up stage"
259
+ },
260
+ "stage.growthScaleUp.focus.1": {
261
+ value: "Growth loops",
262
+ description: "Focus area for Growth / Scale-up stage"
263
+ },
264
+ "stage.growthScaleUp.focus.2": {
265
+ value: "Reliability engineering",
266
+ description: "Focus area for Growth / Scale-up stage"
267
+ },
268
+ "stage.expansionPlatform.focus.0": {
269
+ value: "Partnerships",
270
+ description: "Focus area for Expansion / Platform stage"
271
+ },
272
+ "stage.expansionPlatform.focus.1": {
273
+ value: "APIs",
274
+ description: "Focus area for Expansion / Platform stage"
275
+ },
276
+ "stage.expansionPlatform.focus.2": {
277
+ value: "New market validation",
278
+ description: "Focus area for Expansion / Platform stage"
279
+ },
280
+ "stage.maturityRenewal.focus.0": {
281
+ value: "Cost optimization",
282
+ description: "Focus area for Maturity / Renewal stage"
283
+ },
284
+ "stage.maturityRenewal.focus.1": {
285
+ value: "Reinvention bets",
286
+ description: "Focus area for Maturity / Renewal stage"
287
+ },
288
+ "stage.maturityRenewal.focus.2": {
289
+ value: "Sunset planning",
290
+ description: "Focus area for Maturity / Renewal stage"
291
+ },
292
+ "formatter.stageTitle": {
293
+ value: "Stage {order} · {name}",
294
+ description: "Title template for stage summary",
295
+ placeholders: [
296
+ { name: "order", type: "number" },
297
+ { name: "name", type: "string" }
298
+ ]
299
+ },
300
+ "formatter.axis.product": {
301
+ value: "Product: {phase}",
302
+ description: "Product axis label in summary",
303
+ placeholders: [{ name: "phase", type: "string" }]
304
+ },
305
+ "formatter.axis.company": {
306
+ value: "Company: {phase}",
307
+ description: "Company axis label in summary",
308
+ placeholders: [{ name: "phase", type: "string" }]
309
+ },
310
+ "formatter.axis.capital": {
311
+ value: "Capital: {phase}",
312
+ description: "Capital axis label in summary",
313
+ placeholders: [{ name: "phase", type: "string" }]
314
+ },
315
+ "formatter.action.fallback": {
316
+ value: "Focus on upcoming milestones.",
317
+ description: "Default action copy when no top action exists"
318
+ },
319
+ "formatter.digest": {
320
+ value: "Next up for {name}: {actionCopy}",
321
+ description: "Recommendation digest template",
322
+ placeholders: [
323
+ { name: "name", type: "string" },
324
+ { name: "actionCopy", type: "string" }
325
+ ]
326
+ }
327
+ }
328
+ });
329
+
330
+ // src/i18n/catalogs/fr.ts
331
+ import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
332
+ var frMessages = defineTranslation2({
333
+ meta: {
334
+ key: "lifecycle.messages",
335
+ version: "1.0.0",
336
+ domain: "lifecycle",
337
+ description: "Display labels, stage metadata, and formatter strings for the lifecycle package (French)",
338
+ owners: ["platform"],
339
+ stability: "experimental"
340
+ },
341
+ locale: "fr",
342
+ fallback: "en",
343
+ messages: {
344
+ "stage.exploration.name": {
345
+ value: "Exploration / Idéation",
346
+ description: "Display name for the Exploration stage"
347
+ },
348
+ "stage.problemSolutionFit.name": {
349
+ value: "Adéquation problème–solution",
350
+ description: "Display name for the Problem-Solution Fit stage"
351
+ },
352
+ "stage.mvpEarlyTraction.name": {
353
+ value: "MVP et première traction",
354
+ description: "Display name for the MVP & Early Traction stage"
355
+ },
356
+ "stage.productMarketFit.name": {
357
+ value: "Adéquation produit–marché",
358
+ description: "Display name for the Product-Market Fit stage"
359
+ },
360
+ "stage.growthScaleUp.name": {
361
+ value: "Croissance / Mise à l’échelle",
362
+ description: "Display name for the Growth / Scale-up stage"
363
+ },
364
+ "stage.expansionPlatform.name": {
365
+ value: "Expansion / Plateforme",
366
+ description: "Display name for the Expansion / Platform stage"
367
+ },
368
+ "stage.maturityRenewal.name": {
369
+ value: "Maturité / Renouvellement",
370
+ description: "Display name for the Maturity / Renewal stage"
371
+ },
372
+ "stage.exploration.question": {
373
+ value: "Y a-t-il un problème qui mérite mon temps ?",
374
+ description: "Key question for the Exploration stage"
375
+ },
376
+ "stage.problemSolutionFit.question": {
377
+ value: "Les gens se soucient-ils assez de cette solution ?",
378
+ description: "Key question for the Problem-Solution Fit stage"
379
+ },
380
+ "stage.mvpEarlyTraction.question": {
381
+ value: "Peut-on obtenir une utilisation réelle et apprendre vite ?",
382
+ description: "Key question for the MVP & Early Traction stage"
383
+ },
384
+ "stage.productMarketFit.question": {
385
+ value: "Est-ce que cela nous tire vers l’avant ?",
386
+ description: "Key question for the Product-Market Fit stage"
387
+ },
388
+ "stage.growthScaleUp.question": {
389
+ value: "Peut-on faire croître de manière répétable ?",
390
+ description: "Key question for the Growth / Scale-up stage"
391
+ },
392
+ "stage.expansionPlatform.question": {
393
+ value: "Quelle est la prochaine courbe de croissance ?",
394
+ description: "Key question for the Expansion / Platform stage"
395
+ },
396
+ "stage.maturityRenewal.question": {
397
+ value: "Optimiser, réinventer ou arrêter ?",
398
+ description: "Key question for the Maturity / Renewal stage"
399
+ },
400
+ "stage.exploration.signal.0": {
401
+ value: "20+ entretiens de découverte",
402
+ description: "Signal for Exploration stage"
403
+ },
404
+ "stage.exploration.signal.1": {
405
+ value: "Énoncé clair du problème",
406
+ description: "Signal for Exploration stage"
407
+ },
408
+ "stage.exploration.signal.2": {
409
+ value: "ICP nommé",
410
+ description: "Signal for Exploration stage"
411
+ },
412
+ "stage.problemSolutionFit.signal.0": {
413
+ value: "Réutilisation du prototype",
414
+ description: "Signal for Problem-Solution Fit stage"
415
+ },
416
+ "stage.problemSolutionFit.signal.1": {
417
+ value: "Énergie de recommandation",
418
+ description: "Signal for Problem-Solution Fit stage"
419
+ },
420
+ "stage.problemSolutionFit.signal.2": {
421
+ value: "Intérêt de prépaiement",
422
+ description: "Signal for Problem-Solution Fit stage"
423
+ },
424
+ "stage.mvpEarlyTraction.signal.0": {
425
+ value: "20–50 utilisateurs actifs nommés",
426
+ description: "Signal for MVP & Early Traction stage"
427
+ },
428
+ "stage.mvpEarlyTraction.signal.1": {
429
+ value: "Livraisons hebdomadaires",
430
+ description: "Signal for MVP & Early Traction stage"
431
+ },
432
+ "stage.mvpEarlyTraction.signal.2": {
433
+ value: "Retours bruyants",
434
+ description: "Signal for MVP & Early Traction stage"
435
+ },
436
+ "stage.productMarketFit.signal.0": {
437
+ value: "Rétention sans héroïsme",
438
+ description: "Signal for Product-Market Fit stage"
439
+ },
440
+ "stage.productMarketFit.signal.1": {
441
+ value: "Bouche-à-oreille organique",
442
+ description: "Signal for Product-Market Fit stage"
443
+ },
444
+ "stage.productMarketFit.signal.2": {
445
+ value: "Témoignages de valeur",
446
+ description: "Signal for Product-Market Fit stage"
447
+ },
448
+ "stage.growthScaleUp.signal.0": {
449
+ value: "Canaux prévisibles",
450
+ description: "Signal for Growth / Scale-up stage"
451
+ },
452
+ "stage.growthScaleUp.signal.1": {
453
+ value: "Recrutements spécialisés",
454
+ description: "Signal for Growth / Scale-up stage"
455
+ },
456
+ "stage.growthScaleUp.signal.2": {
457
+ value: "Économie unitaire en bonne voie",
458
+ description: "Signal for Growth / Scale-up stage"
459
+ },
460
+ "stage.expansionPlatform.signal.0": {
461
+ value: "Métriques clés stables",
462
+ description: "Signal for Expansion / Platform stage"
463
+ },
464
+ "stage.expansionPlatform.signal.1": {
465
+ value: "Demande partenaires/API",
466
+ description: "Signal for Expansion / Platform stage"
467
+ },
468
+ "stage.expansionPlatform.signal.2": {
469
+ value: "Attraction d’écosystème",
470
+ description: "Signal for Expansion / Platform stage"
471
+ },
472
+ "stage.maturityRenewal.signal.0": {
473
+ value: "Focus sur les marges",
474
+ description: "Signal for Maturity / Renewal stage"
475
+ },
476
+ "stage.maturityRenewal.signal.1": {
477
+ value: "Paris de portefeuille",
478
+ description: "Signal for Maturity / Renewal stage"
479
+ },
480
+ "stage.maturityRenewal.signal.2": {
481
+ value: "Rafraîchissement du récit",
482
+ description: "Signal for Maturity / Renewal stage"
483
+ },
484
+ "stage.exploration.trap.0": {
485
+ value: "Image de marque avant la découverte",
486
+ description: "Trap for Exploration stage"
487
+ },
488
+ "stage.exploration.trap.1": {
489
+ value: "Décisions d’outillage prématurées",
490
+ description: "Trap for Exploration stage"
491
+ },
492
+ "stage.problemSolutionFit.trap.0": {
493
+ value: "« Le marché est énorme » sans utilisateurs",
494
+ description: "Trap for Problem-Solution Fit stage"
495
+ },
496
+ "stage.problemSolutionFit.trap.1": {
497
+ value: "Sauter les boucles qualitatives",
498
+ description: "Trap for Problem-Solution Fit stage"
499
+ },
500
+ "stage.mvpEarlyTraction.trap.0": {
501
+ value: "Infra surdimensionnée pour 10 utilisateurs",
502
+ description: "Trap for MVP & Early Traction stage"
503
+ },
504
+ "stage.mvpEarlyTraction.trap.1": {
505
+ value: "Métrique de rétention indéfinie",
506
+ description: "Trap for MVP & Early Traction stage"
507
+ },
508
+ "stage.productMarketFit.trap.0": {
509
+ value: "Croissance héroïque non scalable",
510
+ description: "Trap for Product-Market Fit stage"
511
+ },
512
+ "stage.productMarketFit.trap.1": {
513
+ value: "Ignorer les signaux d’attrition",
514
+ description: "Trap for Product-Market Fit stage"
515
+ },
516
+ "stage.growthScaleUp.trap.0": {
517
+ value: "Dépenses publicitaires masquant les problèmes de rétention",
518
+ description: "Trap for Growth / Scale-up stage"
519
+ },
520
+ "stage.growthScaleUp.trap.1": {
521
+ value: "Dette infra bloquant les lancements",
522
+ description: "Trap for Growth / Scale-up stage"
523
+ },
524
+ "stage.expansionPlatform.trap.0": {
525
+ value: "Théâtre de plateforme avant que le coin soit solide",
526
+ description: "Trap for Expansion / Platform stage"
527
+ },
528
+ "stage.maturityRenewal.trap.0": {
529
+ value: "Supposer que le succès passé suffit",
530
+ description: "Trap for Maturity / Renewal stage"
531
+ },
532
+ "stage.exploration.focus.0": {
533
+ value: "Découverte client",
534
+ description: "Focus area for Exploration stage"
535
+ },
536
+ "stage.exploration.focus.1": {
537
+ value: "Définition du problème",
538
+ description: "Focus area for Exploration stage"
539
+ },
540
+ "stage.exploration.focus.2": {
541
+ value: "Clarté du segment",
542
+ description: "Focus area for Exploration stage"
543
+ },
544
+ "stage.problemSolutionFit.focus.0": {
545
+ value: "Hypothèse de solution",
546
+ description: "Focus area for Problem-Solution Fit stage"
547
+ },
548
+ "stage.problemSolutionFit.focus.1": {
549
+ value: "Message de valeur",
550
+ description: "Focus area for Problem-Solution Fit stage"
551
+ },
552
+ "stage.problemSolutionFit.focus.2": {
553
+ value: "Capture de retours",
554
+ description: "Focus area for Problem-Solution Fit stage"
555
+ },
556
+ "stage.mvpEarlyTraction.focus.0": {
557
+ value: "Activation",
558
+ description: "Focus area for MVP & Early Traction stage"
559
+ },
560
+ "stage.mvpEarlyTraction.focus.1": {
561
+ value: "Suivi de cohortes",
562
+ description: "Focus area for MVP & Early Traction stage"
563
+ },
564
+ "stage.mvpEarlyTraction.focus.2": {
565
+ value: "Rituels de retours",
566
+ description: "Focus area for MVP & Early Traction stage"
567
+ },
568
+ "stage.productMarketFit.focus.0": {
569
+ value: "Rétention",
570
+ description: "Focus area for Product-Market Fit stage"
571
+ },
572
+ "stage.productMarketFit.focus.1": {
573
+ value: "Fiabilité",
574
+ description: "Focus area for Product-Market Fit stage"
575
+ },
576
+ "stage.productMarketFit.focus.2": {
577
+ value: "Clarté de l’ICP",
578
+ description: "Focus area for Product-Market Fit stage"
579
+ },
580
+ "stage.growthScaleUp.focus.0": {
581
+ value: "Systèmes opérationnels",
582
+ description: "Focus area for Growth / Scale-up stage"
583
+ },
584
+ "stage.growthScaleUp.focus.1": {
585
+ value: "Boucles de croissance",
586
+ description: "Focus area for Growth / Scale-up stage"
587
+ },
588
+ "stage.growthScaleUp.focus.2": {
589
+ value: "Ingénierie de fiabilité",
590
+ description: "Focus area for Growth / Scale-up stage"
591
+ },
592
+ "stage.expansionPlatform.focus.0": {
593
+ value: "Partenariats",
594
+ description: "Focus area for Expansion / Platform stage"
595
+ },
596
+ "stage.expansionPlatform.focus.1": {
597
+ value: "APIs",
598
+ description: "Focus area for Expansion / Platform stage"
599
+ },
600
+ "stage.expansionPlatform.focus.2": {
601
+ value: "Validation de nouveaux marchés",
602
+ description: "Focus area for Expansion / Platform stage"
603
+ },
604
+ "stage.maturityRenewal.focus.0": {
605
+ value: "Optimisation des coûts",
606
+ description: "Focus area for Maturity / Renewal stage"
607
+ },
608
+ "stage.maturityRenewal.focus.1": {
609
+ value: "Paris de réinvention",
610
+ description: "Focus area for Maturity / Renewal stage"
611
+ },
612
+ "stage.maturityRenewal.focus.2": {
613
+ value: "Planification de fin de vie",
614
+ description: "Focus area for Maturity / Renewal stage"
615
+ },
616
+ "formatter.stageTitle": {
617
+ value: "Étape {order} · {name}",
618
+ description: "Title template for stage summary"
619
+ },
620
+ "formatter.axis.product": {
621
+ value: "Produit : {phase}",
622
+ description: "Product axis label in summary"
623
+ },
624
+ "formatter.axis.company": {
625
+ value: "Entreprise : {phase}",
626
+ description: "Company axis label in summary"
627
+ },
628
+ "formatter.axis.capital": {
629
+ value: "Capital : {phase}",
630
+ description: "Capital axis label in summary"
631
+ },
632
+ "formatter.action.fallback": {
633
+ value: "Concentrez-vous sur les prochains jalons.",
634
+ description: "Default action copy when no top action exists"
635
+ },
636
+ "formatter.digest": {
637
+ value: "Prochaine étape pour {name} : {actionCopy}",
638
+ description: "Recommendation digest template"
639
+ }
640
+ }
641
+ });
642
+
643
+ // src/i18n/catalogs/es.ts
644
+ import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
645
+ var esMessages = defineTranslation3({
646
+ meta: {
647
+ key: "lifecycle.messages",
648
+ version: "1.0.0",
649
+ domain: "lifecycle",
650
+ description: "Display labels, stage metadata, and formatter strings for the lifecycle package (Spanish)",
651
+ owners: ["platform"],
652
+ stability: "experimental"
653
+ },
654
+ locale: "es",
655
+ fallback: "en",
656
+ messages: {
657
+ "stage.exploration.name": {
658
+ value: "Exploración / Ideación",
659
+ description: "Display name for the Exploration stage"
660
+ },
661
+ "stage.problemSolutionFit.name": {
662
+ value: "Ajuste problema–solución",
663
+ description: "Display name for the Problem-Solution Fit stage"
664
+ },
665
+ "stage.mvpEarlyTraction.name": {
666
+ value: "MVP y tracción inicial",
667
+ description: "Display name for the MVP & Early Traction stage"
668
+ },
669
+ "stage.productMarketFit.name": {
670
+ value: "Ajuste producto–mercado",
671
+ description: "Display name for the Product-Market Fit stage"
672
+ },
673
+ "stage.growthScaleUp.name": {
674
+ value: "Crecimiento / Escalamiento",
675
+ description: "Display name for the Growth / Scale-up stage"
676
+ },
677
+ "stage.expansionPlatform.name": {
678
+ value: "Expansión / Plataforma",
679
+ description: "Display name for the Expansion / Platform stage"
680
+ },
681
+ "stage.maturityRenewal.name": {
682
+ value: "Madurez / Renovación",
683
+ description: "Display name for the Maturity / Renewal stage"
684
+ },
685
+ "stage.exploration.question": {
686
+ value: "¿Hay un problema que merece mi tiempo?",
687
+ description: "Key question for the Exploration stage"
688
+ },
689
+ "stage.problemSolutionFit.question": {
690
+ value: "¿La gente se preocupa lo suficiente por esta solución?",
691
+ description: "Key question for the Problem-Solution Fit stage"
692
+ },
693
+ "stage.mvpEarlyTraction.question": {
694
+ value: "¿Podemos obtener uso real y aprender rápido?",
695
+ description: "Key question for the MVP & Early Traction stage"
696
+ },
697
+ "stage.productMarketFit.question": {
698
+ value: "¿Esto nos está impulsando hacia adelante?",
699
+ description: "Key question for the Product-Market Fit stage"
700
+ },
701
+ "stage.growthScaleUp.question": {
702
+ value: "¿Podemos crecer de forma repetible?",
703
+ description: "Key question for the Growth / Scale-up stage"
704
+ },
705
+ "stage.expansionPlatform.question": {
706
+ value: "¿Cuál es la próxima curva de crecimiento?",
707
+ description: "Key question for the Expansion / Platform stage"
708
+ },
709
+ "stage.maturityRenewal.question": {
710
+ value: "¿Optimizar, reinventar o descontinuar?",
711
+ description: "Key question for the Maturity / Renewal stage"
712
+ },
713
+ "stage.exploration.signal.0": {
714
+ value: "20+ entrevistas de descubrimiento",
715
+ description: "Signal for Exploration stage"
716
+ },
717
+ "stage.exploration.signal.1": {
718
+ value: "Planteamiento claro del problema",
719
+ description: "Signal for Exploration stage"
720
+ },
721
+ "stage.exploration.signal.2": {
722
+ value: "ICP identificado",
723
+ description: "Signal for Exploration stage"
724
+ },
725
+ "stage.problemSolutionFit.signal.0": {
726
+ value: "Reutilización del prototipo",
727
+ description: "Signal for Problem-Solution Fit stage"
728
+ },
729
+ "stage.problemSolutionFit.signal.1": {
730
+ value: "Energía de recomendación",
731
+ description: "Signal for Problem-Solution Fit stage"
732
+ },
733
+ "stage.problemSolutionFit.signal.2": {
734
+ value: "Interés de prepago",
735
+ description: "Signal for Problem-Solution Fit stage"
736
+ },
737
+ "stage.mvpEarlyTraction.signal.0": {
738
+ value: "20–50 usuarios activos identificados",
739
+ description: "Signal for MVP & Early Traction stage"
740
+ },
741
+ "stage.mvpEarlyTraction.signal.1": {
742
+ value: "Lanzamientos semanales",
743
+ description: "Signal for MVP & Early Traction stage"
744
+ },
745
+ "stage.mvpEarlyTraction.signal.2": {
746
+ value: "Retroalimentación ruidosa",
747
+ description: "Signal for MVP & Early Traction stage"
748
+ },
749
+ "stage.productMarketFit.signal.0": {
750
+ value: "Retención sin heroísmos",
751
+ description: "Signal for Product-Market Fit stage"
752
+ },
753
+ "stage.productMarketFit.signal.1": {
754
+ value: "Boca a boca orgánico",
755
+ description: "Signal for Product-Market Fit stage"
756
+ },
757
+ "stage.productMarketFit.signal.2": {
758
+ value: "Historias de valor",
759
+ description: "Signal for Product-Market Fit stage"
760
+ },
761
+ "stage.growthScaleUp.signal.0": {
762
+ value: "Canales predecibles",
763
+ description: "Signal for Growth / Scale-up stage"
764
+ },
765
+ "stage.growthScaleUp.signal.1": {
766
+ value: "Contrataciones especializadas",
767
+ description: "Signal for Growth / Scale-up stage"
768
+ },
769
+ "stage.growthScaleUp.signal.2": {
770
+ value: "Economía unitaria en camino",
771
+ description: "Signal for Growth / Scale-up stage"
772
+ },
773
+ "stage.expansionPlatform.signal.0": {
774
+ value: "Métricas centrales estables",
775
+ description: "Signal for Expansion / Platform stage"
776
+ },
777
+ "stage.expansionPlatform.signal.1": {
778
+ value: "Demanda de socios/API",
779
+ description: "Signal for Expansion / Platform stage"
780
+ },
781
+ "stage.expansionPlatform.signal.2": {
782
+ value: "Atracción del ecosistema",
783
+ description: "Signal for Expansion / Platform stage"
784
+ },
785
+ "stage.maturityRenewal.signal.0": {
786
+ value: "Enfoque en márgenes",
787
+ description: "Signal for Maturity / Renewal stage"
788
+ },
789
+ "stage.maturityRenewal.signal.1": {
790
+ value: "Apuestas de portafolio",
791
+ description: "Signal for Maturity / Renewal stage"
792
+ },
793
+ "stage.maturityRenewal.signal.2": {
794
+ value: "Renovación de la narrativa",
795
+ description: "Signal for Maturity / Renewal stage"
796
+ },
797
+ "stage.exploration.trap.0": {
798
+ value: "Marca antes del descubrimiento",
799
+ description: "Trap for Exploration stage"
800
+ },
801
+ "stage.exploration.trap.1": {
802
+ value: "Decisiones de herramientas prematuras",
803
+ description: "Trap for Exploration stage"
804
+ },
805
+ "stage.problemSolutionFit.trap.0": {
806
+ value: "«El mercado es enorme» sin usuarios",
807
+ description: "Trap for Problem-Solution Fit stage"
808
+ },
809
+ "stage.problemSolutionFit.trap.1": {
810
+ value: "Saltar los ciclos cualitativos",
811
+ description: "Trap for Problem-Solution Fit stage"
812
+ },
813
+ "stage.mvpEarlyTraction.trap.0": {
814
+ value: "Infraestructura sobredimensionada para 10 usuarios",
815
+ description: "Trap for MVP & Early Traction stage"
816
+ },
817
+ "stage.mvpEarlyTraction.trap.1": {
818
+ value: "Métrica de retención indefinida",
819
+ description: "Trap for MVP & Early Traction stage"
820
+ },
821
+ "stage.productMarketFit.trap.0": {
822
+ value: "Crecimiento heroico que no escala",
823
+ description: "Trap for Product-Market Fit stage"
824
+ },
825
+ "stage.productMarketFit.trap.1": {
826
+ value: "Ignorar señales de abandono",
827
+ description: "Trap for Product-Market Fit stage"
828
+ },
829
+ "stage.growthScaleUp.trap.0": {
830
+ value: "Gasto publicitario enmascarando problemas de retención",
831
+ description: "Trap for Growth / Scale-up stage"
832
+ },
833
+ "stage.growthScaleUp.trap.1": {
834
+ value: "Deuda de infraestructura bloqueando lanzamientos",
835
+ description: "Trap for Growth / Scale-up stage"
836
+ },
837
+ "stage.expansionPlatform.trap.0": {
838
+ value: "Teatro de plataforma antes de que la cuña sea sólida",
839
+ description: "Trap for Expansion / Platform stage"
840
+ },
841
+ "stage.maturityRenewal.trap.0": {
842
+ value: "Asumir que el éxito pasado es suficiente",
843
+ description: "Trap for Maturity / Renewal stage"
844
+ },
845
+ "stage.exploration.focus.0": {
846
+ value: "Descubrimiento de clientes",
847
+ description: "Focus area for Exploration stage"
848
+ },
849
+ "stage.exploration.focus.1": {
850
+ value: "Definición del problema",
851
+ description: "Focus area for Exploration stage"
852
+ },
853
+ "stage.exploration.focus.2": {
854
+ value: "Claridad del segmento",
855
+ description: "Focus area for Exploration stage"
856
+ },
857
+ "stage.problemSolutionFit.focus.0": {
858
+ value: "Hipótesis de solución",
859
+ description: "Focus area for Problem-Solution Fit stage"
860
+ },
861
+ "stage.problemSolutionFit.focus.1": {
862
+ value: "Mensaje de valor",
863
+ description: "Focus area for Problem-Solution Fit stage"
864
+ },
865
+ "stage.problemSolutionFit.focus.2": {
866
+ value: "Captura de retroalimentación",
867
+ description: "Focus area for Problem-Solution Fit stage"
868
+ },
869
+ "stage.mvpEarlyTraction.focus.0": {
870
+ value: "Activación",
871
+ description: "Focus area for MVP & Early Traction stage"
872
+ },
873
+ "stage.mvpEarlyTraction.focus.1": {
874
+ value: "Seguimiento de cohortes",
875
+ description: "Focus area for MVP & Early Traction stage"
876
+ },
877
+ "stage.mvpEarlyTraction.focus.2": {
878
+ value: "Rituales de retroalimentación",
879
+ description: "Focus area for MVP & Early Traction stage"
880
+ },
881
+ "stage.productMarketFit.focus.0": {
882
+ value: "Retención",
883
+ description: "Focus area for Product-Market Fit stage"
884
+ },
885
+ "stage.productMarketFit.focus.1": {
886
+ value: "Fiabilidad",
887
+ description: "Focus area for Product-Market Fit stage"
888
+ },
889
+ "stage.productMarketFit.focus.2": {
890
+ value: "Claridad del ICP",
891
+ description: "Focus area for Product-Market Fit stage"
892
+ },
893
+ "stage.growthScaleUp.focus.0": {
894
+ value: "Sistemas operativos",
895
+ description: "Focus area for Growth / Scale-up stage"
896
+ },
897
+ "stage.growthScaleUp.focus.1": {
898
+ value: "Bucles de crecimiento",
899
+ description: "Focus area for Growth / Scale-up stage"
900
+ },
901
+ "stage.growthScaleUp.focus.2": {
902
+ value: "Ingeniería de fiabilidad",
903
+ description: "Focus area for Growth / Scale-up stage"
904
+ },
905
+ "stage.expansionPlatform.focus.0": {
906
+ value: "Alianzas",
907
+ description: "Focus area for Expansion / Platform stage"
908
+ },
909
+ "stage.expansionPlatform.focus.1": {
910
+ value: "APIs",
911
+ description: "Focus area for Expansion / Platform stage"
912
+ },
913
+ "stage.expansionPlatform.focus.2": {
914
+ value: "Validación de nuevos mercados",
915
+ description: "Focus area for Expansion / Platform stage"
916
+ },
917
+ "stage.maturityRenewal.focus.0": {
918
+ value: "Optimización de costos",
919
+ description: "Focus area for Maturity / Renewal stage"
920
+ },
921
+ "stage.maturityRenewal.focus.1": {
922
+ value: "Apuestas de reinvención",
923
+ description: "Focus area for Maturity / Renewal stage"
924
+ },
925
+ "stage.maturityRenewal.focus.2": {
926
+ value: "Planificación de fin de vida",
927
+ description: "Focus area for Maturity / Renewal stage"
928
+ },
929
+ "formatter.stageTitle": {
930
+ value: "Etapa {order} · {name}",
931
+ description: "Title template for stage summary"
932
+ },
933
+ "formatter.axis.product": {
934
+ value: "Producto: {phase}",
935
+ description: "Product axis label in summary"
936
+ },
937
+ "formatter.axis.company": {
938
+ value: "Empresa: {phase}",
939
+ description: "Company axis label in summary"
940
+ },
941
+ "formatter.axis.capital": {
942
+ value: "Capital: {phase}",
943
+ description: "Capital axis label in summary"
944
+ },
945
+ "formatter.action.fallback": {
946
+ value: "Concéntrese en los próximos hitos.",
947
+ description: "Default action copy when no top action exists"
948
+ },
949
+ "formatter.digest": {
950
+ value: "Próximo para {name}: {actionCopy}",
951
+ description: "Recommendation digest template"
952
+ }
953
+ }
954
+ });
955
+
956
+ // src/i18n/messages.ts
957
+ var factory = createI18nFactory({
958
+ specKey: "lifecycle.messages",
959
+ catalogs: [enMessages, frMessages, esMessages]
960
+ });
961
+ var createLifecycleI18n = factory.create;
962
+ var getDefaultI18n = factory.getDefault;
963
+ var resetI18nRegistry = factory.resetRegistry;
964
+
1
965
  // src/types/stages.ts
2
966
  var LifecycleStage;
3
967
  ((LifecycleStage2) => {
@@ -18,93 +982,58 @@ var LIFECYCLE_STAGE_ORDER = [
18
982
  5 /* ExpansionPlatform */,
19
983
  6 /* MaturityRenewal */
20
984
  ];
21
- var LIFECYCLE_STAGE_META = {
22
- [0 /* Exploration */]: {
23
- id: 0 /* Exploration */,
24
- order: 0,
25
- slug: "exploration",
26
- name: "Exploration / Ideation",
27
- question: "Is there a problem worth my time?",
28
- signals: [
29
- "20+ discovery interviews",
30
- "Clear problem statement",
31
- "Named ICP"
32
- ],
33
- traps: ["Branding before discovery", "Premature tooling decisions"],
34
- focusAreas: ["Customer discovery", "Problem definition", "Segment clarity"]
35
- },
36
- [1 /* ProblemSolutionFit */]: {
37
- id: 1 /* ProblemSolutionFit */,
38
- order: 1,
39
- slug: "problem-solution-fit",
40
- name: "Problem–Solution Fit",
41
- question: "Do people care enough about this solution?",
42
- signals: ["Prototype reuse", "Referral energy", "Pre-pay interest"],
43
- traps: ["“Market is huge” without users", "Skipping qualitative loops"],
44
- focusAreas: ["Solution hypothesis", "Value messaging", "Feedback capture"]
45
- },
46
- [2 /* MvpEarlyTraction */]: {
47
- id: 2 /* MvpEarlyTraction */,
48
- order: 2,
49
- slug: "mvp-early-traction",
50
- name: "MVP & Early Traction",
51
- question: "Can we get real usage and learn fast?",
52
- signals: ["20–50 named active users", "Weekly releases", "Noisy feedback"],
53
- traps: ["Overbuilt infra for 10 users", "Undefined retention metric"],
54
- focusAreas: ["Activation", "Cohort tracking", "Feedback rituals"]
55
- },
56
- [3 /* ProductMarketFit */]: {
57
- id: 3 /* ProductMarketFit */,
58
- order: 3,
59
- slug: "product-market-fit",
60
- name: "Product–Market Fit",
61
- question: "Is this pulling us forward?",
62
- signals: [
63
- "Retention without heroics",
64
- "Organic word-of-mouth",
65
- "Value stories"
66
- ],
67
- traps: ["Hero growth that does not scale", "Ignoring churn signals"],
68
- focusAreas: ["Retention", "Reliability", "ICP clarity"]
69
- },
70
- [4 /* GrowthScaleUp */]: {
71
- id: 4 /* GrowthScaleUp */,
72
- order: 4,
73
- slug: "growth-scale-up",
74
- name: "Growth / Scale-up",
75
- question: "Can we grow this repeatably?",
76
- signals: [
77
- "Predictable channels",
78
- "Specialized hires",
79
- "Unit economics on track"
80
- ],
81
- traps: [
82
- "Paid spend masking retention gaps",
83
- "Infra debt blocking launches"
84
- ],
85
- focusAreas: ["Ops systems", "Growth loops", "Reliability engineering"]
86
- },
87
- [5 /* ExpansionPlatform */]: {
88
- id: 5 /* ExpansionPlatform */,
89
- order: 5,
90
- slug: "expansion-platform",
91
- name: "Expansion / Platform",
92
- question: "What is the next growth curve?",
93
- signals: ["Stable core metrics", "Partner/API demand", "Ecosystem pull"],
94
- traps: ["Platform theater before wedge is solid"],
95
- focusAreas: ["Partnerships", "APIs", "New market validation"]
96
- },
97
- [6 /* MaturityRenewal */]: {
98
- id: 6 /* MaturityRenewal */,
99
- order: 6,
100
- slug: "maturity-renewal",
101
- name: "Maturity / Renewal",
102
- question: "Optimize, reinvent, or sunset?",
103
- signals: ["Margin focus", "Portfolio bets", "Narrative refresh"],
104
- traps: ["Assuming past success is enough"],
105
- focusAreas: ["Cost optimization", "Reinvention bets", "Sunset planning"]
985
+ var STAGE_KEY_PREFIXES = {
986
+ [0 /* Exploration */]: "stage.exploration",
987
+ [1 /* ProblemSolutionFit */]: "stage.problemSolutionFit",
988
+ [2 /* MvpEarlyTraction */]: "stage.mvpEarlyTraction",
989
+ [3 /* ProductMarketFit */]: "stage.productMarketFit",
990
+ [4 /* GrowthScaleUp */]: "stage.growthScaleUp",
991
+ [5 /* ExpansionPlatform */]: "stage.expansionPlatform",
992
+ [6 /* MaturityRenewal */]: "stage.maturityRenewal"
993
+ };
994
+ var SIGNAL_COUNT = 3;
995
+ var FOCUS_COUNT = 3;
996
+ var TRAP_COUNTS = {
997
+ [0 /* Exploration */]: 2,
998
+ [1 /* ProblemSolutionFit */]: 2,
999
+ [2 /* MvpEarlyTraction */]: 2,
1000
+ [3 /* ProductMarketFit */]: 2,
1001
+ [4 /* GrowthScaleUp */]: 2,
1002
+ [5 /* ExpansionPlatform */]: 1,
1003
+ [6 /* MaturityRenewal */]: 1
1004
+ };
1005
+ var STAGE_SLUGS = {
1006
+ [0 /* Exploration */]: "exploration",
1007
+ [1 /* ProblemSolutionFit */]: "problem-solution-fit",
1008
+ [2 /* MvpEarlyTraction */]: "mvp-early-traction",
1009
+ [3 /* ProductMarketFit */]: "product-market-fit",
1010
+ [4 /* GrowthScaleUp */]: "growth-scale-up",
1011
+ [5 /* ExpansionPlatform */]: "expansion-platform",
1012
+ [6 /* MaturityRenewal */]: "maturity-renewal"
1013
+ };
1014
+ function buildStageMeta(stage, i18n) {
1015
+ const prefix = STAGE_KEY_PREFIXES[stage];
1016
+ const trapCount = TRAP_COUNTS[stage];
1017
+ return {
1018
+ id: stage,
1019
+ order: stage,
1020
+ slug: STAGE_SLUGS[stage],
1021
+ name: i18n.t(`${prefix}.name`),
1022
+ question: i18n.t(`${prefix}.question`),
1023
+ signals: Array.from({ length: SIGNAL_COUNT }, (_, i) => i18n.t(`${prefix}.signal.${i}`)),
1024
+ traps: Array.from({ length: trapCount }, (_, i) => i18n.t(`${prefix}.trap.${i}`)),
1025
+ focusAreas: Array.from({ length: FOCUS_COUNT }, (_, i) => i18n.t(`${prefix}.focus.${i}`))
1026
+ };
1027
+ }
1028
+ var getLocalizedStageMeta = (locale) => {
1029
+ const i18n = locale ? createLifecycleI18n(locale) : getDefaultI18n();
1030
+ const result = {};
1031
+ for (const stage of LIFECYCLE_STAGE_ORDER) {
1032
+ result[stage] = buildStageMeta(stage, i18n);
106
1033
  }
1034
+ return result;
107
1035
  };
1036
+ var LIFECYCLE_STAGE_META = getLocalizedStageMeta("en");
108
1037
  var getLifecycleStageBySlug = (slug) => {
109
1038
  const entry = Object.values(LIFECYCLE_STAGE_META).find((meta) => meta.slug === slug);
110
1039
  if (!entry) {
@@ -138,10 +1067,15 @@ var CapitalPhase;
138
1067
  CapitalPhase2["LateStage"] = "LateStage";
139
1068
  })(CapitalPhase ||= {});
140
1069
  // src/utils/formatters.ts
141
- var formatStageSummary = (stage, assessment) => {
142
- const meta = LIFECYCLE_STAGE_META[stage];
143
- const title = `Stage ${meta.order} · ${meta.name}`;
144
- const axesSummary = assessment ? summarizeAxes(assessment.axes) : [];
1070
+ var formatStageSummary = (stage, assessment, locale) => {
1071
+ const i18n = locale ? createLifecycleI18n(locale) : getDefaultI18n();
1072
+ const stageMeta = locale ? getLocalizedStageMeta(locale) : LIFECYCLE_STAGE_META;
1073
+ const meta = stageMeta[stage];
1074
+ const title = i18n.t("formatter.stageTitle", {
1075
+ order: meta.order,
1076
+ name: meta.name
1077
+ });
1078
+ const axesSummary = assessment ? summarizeAxes(assessment.axes, locale) : [];
145
1079
  return {
146
1080
  title,
147
1081
  question: meta.question,
@@ -151,30 +1085,39 @@ var formatStageSummary = (stage, assessment) => {
151
1085
  axesSummary
152
1086
  };
153
1087
  };
154
- var summarizeAxes = (axes) => [
155
- `Product: ${axes.product}`,
156
- `Company: ${axes.company}`,
157
- `Capital: ${axes.capital}`
158
- ];
1088
+ var summarizeAxes = (axes, locale) => {
1089
+ const i18n = locale ? createLifecycleI18n(locale) : getDefaultI18n();
1090
+ return [
1091
+ i18n.t("formatter.axis.product", { phase: axes.product }),
1092
+ i18n.t("formatter.axis.company", { phase: axes.company }),
1093
+ i18n.t("formatter.axis.capital", { phase: axes.capital })
1094
+ ];
1095
+ };
159
1096
  var rankStageCandidates = (scores) => [...scores].sort((a, b) => {
160
1097
  if (b.score === a.score) {
161
1098
  return b.confidence - a.confidence;
162
1099
  }
163
1100
  return b.score - a.score;
164
1101
  });
165
- var createRecommendationDigest = (recommendation) => {
166
- const meta = LIFECYCLE_STAGE_META[recommendation.stage];
1102
+ var createRecommendationDigest = (recommendation, locale) => {
1103
+ const i18n = locale ? createLifecycleI18n(locale) : getDefaultI18n();
1104
+ const stageMeta = locale ? getLocalizedStageMeta(locale) : LIFECYCLE_STAGE_META;
1105
+ const meta = stageMeta[recommendation.stage];
167
1106
  const topAction = recommendation.actions[0];
168
- const actionCopy = topAction ? `${topAction.title} (${topAction.estimatedImpact} impact)` : "Focus on upcoming milestones.";
169
- return `Next up for ${meta.name}: ${actionCopy}`;
1107
+ const actionCopy = topAction ? `${topAction.title} (${topAction.estimatedImpact} impact)` : i18n.t("formatter.action.fallback");
1108
+ return i18n.t("formatter.digest", { name: meta.name, actionCopy });
1109
+ };
1110
+ var getStageLabel = (stage, locale) => {
1111
+ const stageMeta = locale ? getLocalizedStageMeta(locale) : LIFECYCLE_STAGE_META;
1112
+ return stageMeta[stage].name;
170
1113
  };
171
- var getStageLabel = (stage) => LIFECYCLE_STAGE_META[stage].name;
172
1114
  var getStageOrderIndex = (stage) => LIFECYCLE_STAGE_ORDER.indexOf(stage);
173
1115
  export {
174
1116
  summarizeAxes,
175
1117
  rankStageCandidates,
176
1118
  getStageOrderIndex,
177
1119
  getStageLabel,
1120
+ getLocalizedStageMeta,
178
1121
  getLifecycleStageBySlug,
179
1122
  formatStageSummary,
180
1123
  createRecommendationDigest,