@contractspec/module.lifecycle-advisor 3.7.6 → 3.7.7

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,8 +1,3 @@
1
- // src/recommendations/recommendation-engine.ts
2
- import {
3
- LIFECYCLE_STAGE_META
4
- } from "@contractspec/lib.lifecycle";
5
-
6
1
  // src/data/stage-playbooks.ts
7
2
  import { LifecycleStage } from "@contractspec/lib.lifecycle";
8
3
 
@@ -346,670 +341,670 @@ var enMessages = defineTranslation({
346
341
  }
347
342
  });
348
343
 
349
- // src/i18n/catalogs/fr.ts
344
+ // src/i18n/catalogs/es.ts
350
345
  import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
351
- var frMessages = defineTranslation2({
346
+ var esMessages = defineTranslation2({
352
347
  meta: {
353
348
  key: "lifecycle-advisor.messages",
354
349
  version: "1.0.0",
355
350
  domain: "lifecycle-advisor",
356
- description: "Playbook, ceremony, library, and engine strings (French)",
351
+ description: "Playbook, ceremony, library, and engine strings (Spanish)",
357
352
  owners: ["platform"],
358
353
  stability: "experimental"
359
354
  },
360
- locale: "fr",
355
+ locale: "es",
361
356
  fallback: "en",
362
357
  messages: {
363
358
  "playbook.stage0.focus.0": {
364
- value: "Découverte",
365
- description: "Stage 0 focus area: Discovery"
359
+ value: "Descubrimiento",
360
+ description: "Stage 0 focus area: discovery research"
366
361
  },
367
362
  "playbook.stage0.focus.1": {
368
- value: "Clarté du problème",
369
- description: "Stage 0 focus area: Problem clarity"
363
+ value: "Claridad del problema",
364
+ description: "Stage 0 focus area: sharpening the problem definition"
370
365
  },
371
366
  "playbook.stage0.focus.2": {
372
367
  value: "Persona",
373
- description: "Stage 0 focus area: Persona"
368
+ description: "Stage 0 focus area: identifying the target persona"
374
369
  },
375
370
  "playbook.stage1.focus.0": {
376
- value: "Prototype",
377
- description: "Stage 1 focus area: Prototype"
371
+ value: "Prototipo",
372
+ description: "Stage 1 focus area: building a prototype"
378
373
  },
379
374
  "playbook.stage1.focus.1": {
380
- value: "Retours",
381
- description: "Stage 1 focus area: Feedback"
375
+ value: "Retroalimentación",
376
+ description: "Stage 1 focus area: gathering user feedback"
382
377
  },
383
378
  "playbook.stage1.focus.2": {
384
- value: "Preuve de valeur",
385
- description: "Stage 1 focus area: Value proof"
379
+ value: "Prueba de valor",
380
+ description: "Stage 1 focus area: proving the value proposition"
386
381
  },
387
382
  "playbook.stage2.focus.0": {
388
- value: "Activation",
389
- description: "Stage 2 focus area: Activation"
383
+ value: "Activación",
384
+ description: "Stage 2 focus area: user activation"
390
385
  },
391
386
  "playbook.stage2.focus.1": {
392
- value: "Télémétrie",
393
- description: "Stage 2 focus area: Telemetry"
387
+ value: "Telemetría",
388
+ description: "Stage 2 focus area: usage telemetry"
394
389
  },
395
390
  "playbook.stage2.focus.2": {
396
- value: "Retours",
397
- description: "Stage 2 focus area: Feedback"
391
+ value: "Retroalimentación",
392
+ description: "Stage 2 focus area: continuous user feedback"
398
393
  },
399
394
  "playbook.stage3.focus.0": {
400
- value: "Rétention",
401
- description: "Stage 3 focus area: Retention"
395
+ value: "Retención",
396
+ description: "Stage 3 focus area: user retention"
402
397
  },
403
398
  "playbook.stage3.focus.1": {
404
- value: "Fiabilité",
405
- description: "Stage 3 focus area: Reliability"
399
+ value: "Fiabilidad",
400
+ description: "Stage 3 focus area: product reliability"
406
401
  },
407
402
  "playbook.stage3.focus.2": {
408
- value: "Récit",
409
- description: "Stage 3 focus area: Story"
403
+ value: "Historia",
404
+ description: "Stage 3 focus area: building the narrative"
410
405
  },
411
406
  "playbook.stage4.focus.0": {
412
- value: "Systèmes",
413
- description: "Stage 4 focus area: Systems"
407
+ value: "Sistemas",
408
+ description: "Stage 4 focus area: scalable systems"
414
409
  },
415
410
  "playbook.stage4.focus.1": {
416
- value: "Boucles de croissance",
417
- description: "Stage 4 focus area: Growth loops"
411
+ value: "Bucles de crecimiento",
412
+ description: "Stage 4 focus area: repeatable growth loops"
418
413
  },
419
414
  "playbook.stage4.focus.2": {
420
- value: "Spécialisation",
421
- description: "Stage 4 focus area: Specialization"
415
+ value: "Especialización",
416
+ description: "Stage 4 focus area: team specialization"
422
417
  },
423
418
  "playbook.stage5.focus.0": {
424
- value: "Partenaires",
425
- description: "Stage 5 focus area: Partners"
419
+ value: "Socios",
420
+ description: "Stage 5 focus area: partner ecosystem"
426
421
  },
427
422
  "playbook.stage5.focus.1": {
428
423
  value: "APIs",
429
- description: "Stage 5 focus area: APIs"
424
+ description: "Stage 5 focus area: platform APIs"
430
425
  },
431
426
  "playbook.stage5.focus.2": {
432
- value: "Paris d'expansion",
433
- description: "Stage 5 focus area: Expansion bets"
427
+ value: "Apuestas de expansión",
428
+ description: "Stage 5 focus area: expansion experiments"
434
429
  },
435
430
  "playbook.stage6.focus.0": {
436
- value: "Optimisation",
437
- description: "Stage 6 focus area: Optimization"
431
+ value: "Optimización",
432
+ description: "Stage 6 focus area: operational optimization"
438
433
  },
439
434
  "playbook.stage6.focus.1": {
440
- value: "Renouvellement",
441
- description: "Stage 6 focus area: Renewal"
435
+ value: "Renovación",
436
+ description: "Stage 6 focus area: product renewal"
442
437
  },
443
438
  "playbook.stage6.focus.2": {
444
- value: "Portefeuille",
445
- description: "Stage 6 focus area: Portfolio"
439
+ value: "Portafolio",
440
+ description: "Stage 6 focus area: portfolio management"
446
441
  },
447
442
  "playbook.stage0.action0.title": {
448
- value: "Mener un sprint d'entretiens de 5 jours",
449
- description: "Stage 0 action 0 title"
443
+ value: "Realizar un sprint de entrevistas de 5 días",
444
+ description: "Action title for stage 0 interview sprint"
450
445
  },
451
446
  "playbook.stage0.action0.description": {
452
- value: "Planifier au moins 5 entretiens consécutifs et capturer les citations brutes.",
453
- description: "Stage 0 action 0 description"
447
+ value: "Programar al menos 5 entrevistas consecutivas y capturar citas sin editar.",
448
+ description: "Action description for stage 0 interview sprint"
454
449
  },
455
450
  "playbook.stage0.action1.title": {
456
- value: "Rédiger l'histoire du problème",
457
- description: "Stage 0 action 1 title"
451
+ value: "Redactar la historia del problema",
452
+ description: "Action title for stage 0 problem narrative"
458
453
  },
459
454
  "playbook.stage0.action1.description": {
460
- value: "Résumer la douleur en un paragraphe que vous pouvez répéter aux partenaires.",
461
- description: "Stage 0 action 1 description"
455
+ value: "Resumir el dolor en un párrafo que puedas repetir a los socios.",
456
+ description: "Action description for stage 0 problem narrative"
462
457
  },
463
458
  "playbook.stage1.action0.title": {
464
- value: "Boucle de retours sur le prototype",
465
- description: "Stage 1 action 0 title"
459
+ value: "Ciclo de retroalimentación del prototipo",
460
+ description: "Action title for stage 1 prototype iteration"
466
461
  },
467
462
  "playbook.stage1.action0.description": {
468
- value: "Livrer un prototype basse fidélité et recueillir 3 tours de réactions.",
469
- description: "Stage 1 action 0 description"
463
+ value: "Entregar un prototipo de baja fidelidad y recopilar 3 rondas de reacciones.",
464
+ description: "Action description for stage 1 prototype iteration"
470
465
  },
471
466
  "playbook.stage1.action1.title": {
472
- value: "Capturer les signaux de recommandation",
473
- description: "Stage 1 action 1 title"
467
+ value: "Capturar señales de recomendación",
468
+ description: "Action title for stage 1 referral tracking"
474
469
  },
475
470
  "playbook.stage1.action1.description": {
476
- value: "Demander à chaque testeur qui d'autre devrait voir la démo.",
477
- description: "Stage 1 action 1 description"
471
+ value: "Preguntar a cada tester quién más debería ver la demo.",
472
+ description: "Action description for stage 1 referral tracking"
478
473
  },
479
474
  "playbook.stage2.action0.title": {
480
- value: "Définir la checklist d'activation",
481
- description: "Stage 2 action 0 title"
475
+ value: "Definir lista de verificación de activación",
476
+ description: "Action title for stage 2 activation definition"
482
477
  },
483
478
  "playbook.stage2.action0.description": {
484
- value: "Documenter les 3 étapes que les utilisateurs doivent terminer pour obtenir de la valeur.",
485
- description: "Stage 2 action 0 description"
479
+ value: "Documentar los 3 pasos que los usuarios deben completar para obtener valor.",
480
+ description: "Action description for stage 2 activation definition"
486
481
  },
487
482
  "playbook.stage2.action1.title": {
488
- value: "Synchronisation hebdomadaire avec les utilisateurs",
489
- description: "Stage 2 action 1 title"
483
+ value: "Sincronización semanal con usuarios",
484
+ description: "Action title for stage 2 user communication"
490
485
  },
491
486
  "playbook.stage2.action1.description": {
492
- value: "Organiser un appel récurrent avec vos 5 testeurs les plus actifs.",
493
- description: "Stage 2 action 1 description"
487
+ value: "Organizar una llamada recurrente con tus 5 testers más activos.",
488
+ description: "Action description for stage 2 user communication"
494
489
  },
495
490
  "playbook.stage3.action0.title": {
496
- value: "Mener une étude de rétention",
497
- description: "Stage 3 action 0 title"
491
+ value: "Realizar un estudio de retención",
492
+ description: "Action title for stage 3 retention analysis"
498
493
  },
499
494
  "playbook.stage3.action0.description": {
500
- value: "Interviewer 3 utilisateurs retenus et publier leurs métriques avant/après.",
501
- description: "Stage 3 action 0 description"
495
+ value: "Entrevistar a 3 usuarios retenidos y publicar sus métricas antes/después.",
496
+ description: "Action description for stage 3 retention analysis"
502
497
  },
503
498
  "playbook.stage3.action1.title": {
504
- value: "Revue légère d'incidents",
505
- description: "Stage 3 action 1 title"
499
+ value: "Revisión ligera de incidentes",
500
+ description: "Action title for stage 3 reliability review"
506
501
  },
507
502
  "playbook.stage3.action1.description": {
508
- value: "Examiner les 2 derniers incidents de fiabilité et capturer les correctifs.",
509
- description: "Stage 3 action 1 description"
503
+ value: "Revisar los últimos 2 problemas de fiabilidad y capturar las correcciones.",
504
+ description: "Action description for stage 3 reliability review"
510
505
  },
511
506
  "playbook.stage4.action0.title": {
512
- value: "Codifier une boucle de croissance",
513
- description: "Stage 4 action 0 title"
507
+ value: "Codificar un bucle de crecimiento",
508
+ description: "Action title for stage 4 growth loop setup"
514
509
  },
515
510
  "playbook.stage4.action0.description": {
516
- value: "Choisir une boucle (SEO, recommandations, outbound) et documenter les responsables + entrées.",
517
- description: "Stage 4 action 0 description"
511
+ value: "Elegir un bucle (SEO, referencias, outbound) y documentar responsables + entradas.",
512
+ description: "Action description for stage 4 growth loop setup"
518
513
  },
519
514
  "playbook.stage4.action1.title": {
520
- value: "Créer la carte de recrutement",
521
- description: "Stage 4 action 1 title"
515
+ value: "Crear mapa de contratación",
516
+ description: "Action title for stage 4 hiring plan"
522
517
  },
523
518
  "playbook.stage4.action1.description": {
524
- value: "Lister les rôles spécialisés nécessaires pour les 2 prochains trimestres.",
525
- description: "Stage 4 action 1 description"
519
+ value: "Listar los roles especializados necesarios para los próximos 2 trimestres.",
520
+ description: "Action description for stage 4 hiring plan"
526
521
  },
527
522
  "playbook.stage5.action0.title": {
528
- value: "Brief de préparation partenaire",
529
- description: "Stage 5 action 0 title"
523
+ value: "Brief de preparación para socios",
524
+ description: "Action title for stage 5 partner preparation"
530
525
  },
531
526
  "playbook.stage5.action0.description": {
532
- value: "Documenter les types de partenaires, propositions de valeur et étapes d'intégration.",
533
- description: "Stage 5 action 0 description"
527
+ value: "Documentar tipos de socios, propuestas de valor y pasos de incorporación.",
528
+ description: "Action description for stage 5 partner preparation"
534
529
  },
535
530
  "playbook.stage5.action1.title": {
536
- value: "Portefeuille d'expériences d'expansion",
537
- description: "Stage 5 action 1 title"
531
+ value: "Portafolio de experimentos de expansión",
532
+ description: "Action title for stage 5 expansion planning"
538
533
  },
539
534
  "playbook.stage5.action1.description": {
540
- value: "Lister les 3 principaux marchés ou lignes de produits avec les responsables.",
541
- description: "Stage 5 action 1 description"
535
+ value: "Listar los 3 principales mercados o líneas de producto con responsables.",
536
+ description: "Action description for stage 5 expansion planning"
542
537
  },
543
538
  "playbook.stage6.action0.title": {
544
- value: "Mener une revue coût-valeur",
545
- description: "Stage 6 action 0 title"
539
+ value: "Realizar una revisión costo-valor",
540
+ description: "Action title for stage 6 margin audit"
546
541
  },
547
542
  "playbook.stage6.action0.description": {
548
- value: "Auditer chaque surface majeure pour l’impact sur les marges.",
549
- description: "Stage 6 action 0 description"
543
+ value: "Auditar cada superficie principal por impacto en márgenes.",
544
+ description: "Action description for stage 6 margin audit"
550
545
  },
551
546
  "playbook.stage6.action1.title": {
552
- value: "Définir le pari de renouvellement",
553
- description: "Stage 6 action 1 title"
547
+ value: "Definir la apuesta de renovación",
548
+ description: "Action title for stage 6 reinvention track"
554
549
  },
555
550
  "playbook.stage6.action1.description": {
556
- value: "Choisir une piste de réinvention ou d'arrêt et définir des points de contrôle.",
557
- description: "Stage 6 action 1 description"
551
+ value: "Elegir una pista de reinvención o descontinuación y establecer puntos de control.",
552
+ description: "Action description for stage 6 reinvention track"
558
553
  },
559
554
  "ceremony.stage0.title": {
560
- value: "Étincelle de découverte",
561
- description: "Stage 0 ceremony title"
555
+ value: "Chispa de descubrimiento",
556
+ description: "Ceremony title for stage 0"
562
557
  },
563
558
  "ceremony.stage0.copy": {
564
- value: "Partagez la citation la plus percutante avec votre équipe. Encadrez-la, célébrez le focus.",
565
- description: "Stage 0 ceremony copy"
559
+ value: "Comparte la cita de dolor más impactante con tu equipo. Enmárcala, celebra el enfoque.",
560
+ description: "Ceremony copy for stage 0"
566
561
  },
567
562
  "ceremony.stage1.title": {
568
- value: "Résonance de la solution",
569
- description: "Stage 1 ceremony title"
563
+ value: "Resonancia de la solución",
564
+ description: "Ceremony title for stage 1"
570
565
  },
571
566
  "ceremony.stage1.copy": {
572
- value: "Enregistrez un court partage d'écran racontant l'histoire avant/après à votre futur vous.",
573
- description: "Stage 1 ceremony copy"
567
+ value: "Graba un breve screencast contando la historia antes/después a tu futuro yo.",
568
+ description: "Ceremony copy for stage 1"
574
569
  },
575
570
  "ceremony.stage2.title": {
576
- value: "Toast à la traction",
577
- description: "Stage 2 ceremony title"
571
+ value: "Brindis por la tracción",
572
+ description: "Ceremony title for stage 2"
578
573
  },
579
574
  "ceremony.stage2.copy": {
580
- value: "Portez un toast à vos 20 premiers vrais utilisateurs dites leurs noms, dites-leur pourquoi ils comptent.",
581
- description: "Stage 2 ceremony copy"
575
+ value: "Brinda por tus primeros 20 usuarios realesdi sus nombres, diles por qué importan.",
576
+ description: "Ceremony copy for stage 2"
582
577
  },
583
578
  "ceremony.stage3.title": {
584
- value: "Signal PMF",
585
- description: "Stage 3 ceremony title"
579
+ value: "Señal de fuego PMF",
580
+ description: "Ceremony title for stage 3"
586
581
  },
587
582
  "ceremony.stage3.copy": {
588
- value: "Écrivez une lettre à votre futur vous de la Série A décrivant l'attraction que vous ressentez aujourd'hui.",
589
- description: "Stage 3 ceremony copy"
583
+ value: "Escribe una carta a tu futuro yo de la Serie A describiendo la atracción que sientes hoy.",
584
+ description: "Ceremony copy for stage 3"
590
585
  },
591
586
  "ceremony.stage4.title": {
592
- value: "Systèmes d'échelle",
593
- description: "Stage 4 ceremony title"
587
+ value: "Sistemas de escala",
588
+ description: "Ceremony title for stage 4"
594
589
  },
595
590
  "ceremony.stage4.copy": {
596
- value: "Invitez l'équipe à cartographier le parcours du premier utilisateur à la machine répétable.",
597
- description: "Stage 4 ceremony copy"
591
+ value: "Invita al equipo a mapear el viaje desde el primer usuario hasta la máquina repetible.",
592
+ description: "Ceremony copy for stage 4"
598
593
  },
599
594
  "ceremony.stage5.title": {
600
- value: "Seuil de la plateforme",
601
- description: "Stage 5 ceremony title"
595
+ value: "Umbral de la plataforma",
596
+ description: "Ceremony title for stage 5"
602
597
  },
603
598
  "ceremony.stage5.copy": {
604
- value: "Organisez un cercle de partenaires invitez les alliés à partager ce dont ils ont besoin de votre plateforme.",
605
- description: "Stage 5 ceremony copy"
599
+ value: "Organiza un círculo de sociosinvita a los aliados a compartir lo que necesitan de tu plataforma.",
600
+ description: "Ceremony copy for stage 5"
606
601
  },
607
602
  "ceremony.stage6.title": {
608
- value: "Sommet du renouvellement",
609
- description: "Stage 6 ceremony title"
603
+ value: "Cumbre de renovación",
604
+ description: "Ceremony title for stage 6"
610
605
  },
611
606
  "ceremony.stage6.copy": {
612
- value: "Faites une pause pour honorer ce qui vous a amené ici, puis engagez-vous publiquement pour la prochaine réinvention.",
613
- description: "Stage 6 ceremony copy"
607
+ value: "Haz una pausa para honrar lo que te trajo aquí, luego comprómetete públicamente con la próxima reinvención.",
608
+ description: "Ceremony copy for stage 6"
614
609
  },
615
610
  "library.stage0.item0": {
616
- value: "Résumer les entretiens et synthétiser les insights IC.",
617
- description: "Stage 0 library item 0"
611
+ value: "Resumir entrevistas y sintetizar insights de IC.",
612
+ description: "Library tool description for stage 0 item 0"
618
613
  },
619
614
  "library.stage0.item1": {
620
- value: "Créer des storyboards basse fidélité sans code personnalisé.",
621
- description: "Stage 0 library item 1"
615
+ value: "Crear storyboards de baja fidelidad sin código personalizado.",
616
+ description: "Library tool description for stage 0 item 1"
622
617
  },
623
618
  "library.stage1.item0": {
624
- value: "Contrôler les fonctionnalités prototype derrière des flags légers.",
625
- description: "Stage 1 library item 0"
619
+ value: "Controlar funcionalidades del prototipo detrás de flags ligeros.",
620
+ description: "Library tool description for stage 1 item 0"
626
621
  },
627
622
  "library.stage1.item1": {
628
- value: "Capturer les signaux de questionnaire pour un scoring précoce.",
629
- description: "Stage 1 library item 1"
623
+ value: "Capturar señales de cuestionario para scoring temprano.",
624
+ description: "Library tool description for stage 1 item 1"
630
625
  },
631
626
  "library.stage2.item0": {
632
- value: "Instrumenter les parcours d'activation + cohortes.",
633
- description: "Stage 2 library item 0"
627
+ value: "Instrumentar rutas de activación + cohortes.",
628
+ description: "Library tool description for stage 2 item 0"
634
629
  },
635
630
  "library.stage2.item1": {
636
- value: "Collecter les traces et métriques minimales viables.",
637
- description: "Stage 2 library item 1"
631
+ value: "Recopilar trazas y métricas mínimas viables.",
632
+ description: "Library tool description for stage 2 item 1"
638
633
  },
639
634
  "library.stage3.item0": {
640
- value: "Détecter automatiquement les lacunes de contrat et améliorations de spec.",
641
- description: "Stage 3 library item 0"
635
+ value: "Detectar automáticamente brechas de contrato y mejoras de spec.",
636
+ description: "Library tool description for stage 3 item 0"
642
637
  },
643
638
  "library.stage3.item1": {
644
- value: "Générer des conseils axés sur la rétention à grande échelle.",
645
- description: "Stage 3 library item 1"
639
+ value: "Generar orientación enfocada en retención a escala.",
640
+ description: "Library tool description for stage 3 item 1"
646
641
  },
647
642
  "library.stage4.item0": {
648
- value: "Orchestration d'expériences avec garde-fous.",
649
- description: "Stage 4 library item 0"
643
+ value: "Orquestación de experimentos con barandillas.",
644
+ description: "Library tool description for stage 4 item 0"
650
645
  },
651
646
  "library.stage4.item1": {
652
- value: "Stabiliser l’infra et les SLOs au fur et à mesure que les équipes se divisent.",
653
- description: "Stage 4 library item 1"
647
+ value: "Estabilizar infraestructura y SLOs a medida que los equipos se dividen.",
648
+ description: "Library tool description for stage 4 item 1"
654
649
  },
655
650
  "library.stage5.item0": {
656
- value: "Automatiser les workflows partenaires et intégrations.",
657
- description: "Stage 5 library item 0"
651
+ value: "Automatizar flujos de trabajo de socios e integraciones.",
652
+ description: "Library tool description for stage 5 item 0"
658
653
  },
659
654
  "library.stage5.item1": {
660
- value: "Exposer l'intégration partenaire gérée via Studio.",
661
- description: "Stage 5 library item 1"
655
+ value: "Exponer incorporación de socios gestionada vía Studio.",
656
+ description: "Library tool description for stage 5 item 1"
662
657
  },
663
658
  "library.stage6.item0": {
664
- value: "Modéliser les scénarios de marge et paris de réinvestissement.",
665
- description: "Stage 6 library item 0"
659
+ value: "Modelar escenarios de margen y apuestas de reinversión.",
660
+ description: "Library tool description for stage 6 item 0"
666
661
  },
667
662
  "library.stage6.item1": {
668
- value: "Standardiser les rituels de renouvellement et l'automatisation.",
669
- description: "Stage 6 library item 1"
663
+ value: "Estandarizar rituales de renovación y automatización.",
664
+ description: "Library tool description for stage 6 item 1"
670
665
  },
671
666
  "engine.fallbackAction.title": {
672
- value: "Avancer sur {focus}",
673
- description: "Fallback action title with focus placeholder"
667
+ value: "Avanzar en {focus}",
668
+ description: "Fallback action title when no specific action exists",
669
+ placeholders: [{ name: "focus", type: "string" }]
674
670
  },
675
671
  "engine.fallbackAction.description": {
676
- value: "Identifier une tâche qui améliorera « {focus} » cette semaine.",
677
- description: "Fallback action description with focus placeholder"
672
+ value: 'Identificar una tarea que mejore "{focus}" esta semana.',
673
+ description: "Fallback action description when no specific action exists",
674
+ placeholders: [{ name: "focus", type: "string" }]
678
675
  }
679
676
  }
680
677
  });
681
678
 
682
- // src/i18n/catalogs/es.ts
679
+ // src/i18n/catalogs/fr.ts
683
680
  import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
684
- var esMessages = defineTranslation3({
681
+ var frMessages = defineTranslation3({
685
682
  meta: {
686
683
  key: "lifecycle-advisor.messages",
687
684
  version: "1.0.0",
688
685
  domain: "lifecycle-advisor",
689
- description: "Playbook, ceremony, library, and engine strings (Spanish)",
686
+ description: "Playbook, ceremony, library, and engine strings (French)",
690
687
  owners: ["platform"],
691
688
  stability: "experimental"
692
689
  },
693
- locale: "es",
690
+ locale: "fr",
694
691
  fallback: "en",
695
692
  messages: {
696
693
  "playbook.stage0.focus.0": {
697
- value: "Descubrimiento",
698
- description: "Stage 0 focus area: discovery research"
694
+ value: "Découverte",
695
+ description: "Stage 0 focus area: Discovery"
699
696
  },
700
697
  "playbook.stage0.focus.1": {
701
- value: "Claridad del problema",
702
- description: "Stage 0 focus area: sharpening the problem definition"
698
+ value: "Clarté du problème",
699
+ description: "Stage 0 focus area: Problem clarity"
703
700
  },
704
701
  "playbook.stage0.focus.2": {
705
702
  value: "Persona",
706
- description: "Stage 0 focus area: identifying the target persona"
703
+ description: "Stage 0 focus area: Persona"
707
704
  },
708
705
  "playbook.stage1.focus.0": {
709
- value: "Prototipo",
710
- description: "Stage 1 focus area: building a prototype"
706
+ value: "Prototype",
707
+ description: "Stage 1 focus area: Prototype"
711
708
  },
712
709
  "playbook.stage1.focus.1": {
713
- value: "Retroalimentación",
714
- description: "Stage 1 focus area: gathering user feedback"
710
+ value: "Retours",
711
+ description: "Stage 1 focus area: Feedback"
715
712
  },
716
713
  "playbook.stage1.focus.2": {
717
- value: "Prueba de valor",
718
- description: "Stage 1 focus area: proving the value proposition"
714
+ value: "Preuve de valeur",
715
+ description: "Stage 1 focus area: Value proof"
719
716
  },
720
717
  "playbook.stage2.focus.0": {
721
- value: "Activación",
722
- description: "Stage 2 focus area: user activation"
718
+ value: "Activation",
719
+ description: "Stage 2 focus area: Activation"
723
720
  },
724
721
  "playbook.stage2.focus.1": {
725
- value: "Telemetría",
726
- description: "Stage 2 focus area: usage telemetry"
722
+ value: "Télémétrie",
723
+ description: "Stage 2 focus area: Telemetry"
727
724
  },
728
725
  "playbook.stage2.focus.2": {
729
- value: "Retroalimentación",
730
- description: "Stage 2 focus area: continuous user feedback"
726
+ value: "Retours",
727
+ description: "Stage 2 focus area: Feedback"
731
728
  },
732
729
  "playbook.stage3.focus.0": {
733
- value: "Retención",
734
- description: "Stage 3 focus area: user retention"
730
+ value: "Rétention",
731
+ description: "Stage 3 focus area: Retention"
735
732
  },
736
733
  "playbook.stage3.focus.1": {
737
- value: "Fiabilidad",
738
- description: "Stage 3 focus area: product reliability"
734
+ value: "Fiabilité",
735
+ description: "Stage 3 focus area: Reliability"
739
736
  },
740
737
  "playbook.stage3.focus.2": {
741
- value: "Historia",
742
- description: "Stage 3 focus area: building the narrative"
738
+ value: "Récit",
739
+ description: "Stage 3 focus area: Story"
743
740
  },
744
741
  "playbook.stage4.focus.0": {
745
- value: "Sistemas",
746
- description: "Stage 4 focus area: scalable systems"
742
+ value: "Systèmes",
743
+ description: "Stage 4 focus area: Systems"
747
744
  },
748
745
  "playbook.stage4.focus.1": {
749
- value: "Bucles de crecimiento",
750
- description: "Stage 4 focus area: repeatable growth loops"
746
+ value: "Boucles de croissance",
747
+ description: "Stage 4 focus area: Growth loops"
751
748
  },
752
749
  "playbook.stage4.focus.2": {
753
- value: "Especialización",
754
- description: "Stage 4 focus area: team specialization"
750
+ value: "Spécialisation",
751
+ description: "Stage 4 focus area: Specialization"
755
752
  },
756
753
  "playbook.stage5.focus.0": {
757
- value: "Socios",
758
- description: "Stage 5 focus area: partner ecosystem"
754
+ value: "Partenaires",
755
+ description: "Stage 5 focus area: Partners"
759
756
  },
760
757
  "playbook.stage5.focus.1": {
761
758
  value: "APIs",
762
- description: "Stage 5 focus area: platform APIs"
759
+ description: "Stage 5 focus area: APIs"
763
760
  },
764
761
  "playbook.stage5.focus.2": {
765
- value: "Apuestas de expansión",
766
- description: "Stage 5 focus area: expansion experiments"
762
+ value: "Paris d'expansion",
763
+ description: "Stage 5 focus area: Expansion bets"
767
764
  },
768
765
  "playbook.stage6.focus.0": {
769
- value: "Optimización",
770
- description: "Stage 6 focus area: operational optimization"
766
+ value: "Optimisation",
767
+ description: "Stage 6 focus area: Optimization"
771
768
  },
772
769
  "playbook.stage6.focus.1": {
773
- value: "Renovación",
774
- description: "Stage 6 focus area: product renewal"
770
+ value: "Renouvellement",
771
+ description: "Stage 6 focus area: Renewal"
775
772
  },
776
773
  "playbook.stage6.focus.2": {
777
- value: "Portafolio",
778
- description: "Stage 6 focus area: portfolio management"
774
+ value: "Portefeuille",
775
+ description: "Stage 6 focus area: Portfolio"
779
776
  },
780
777
  "playbook.stage0.action0.title": {
781
- value: "Realizar un sprint de entrevistas de 5 días",
782
- description: "Action title for stage 0 interview sprint"
778
+ value: "Mener un sprint d'entretiens de 5 jours",
779
+ description: "Stage 0 action 0 title"
783
780
  },
784
781
  "playbook.stage0.action0.description": {
785
- value: "Programar al menos 5 entrevistas consecutivas y capturar citas sin editar.",
786
- description: "Action description for stage 0 interview sprint"
782
+ value: "Planifier au moins 5 entretiens consécutifs et capturer les citations brutes.",
783
+ description: "Stage 0 action 0 description"
787
784
  },
788
785
  "playbook.stage0.action1.title": {
789
- value: "Redactar la historia del problema",
790
- description: "Action title for stage 0 problem narrative"
786
+ value: "Rédiger l'histoire du problème",
787
+ description: "Stage 0 action 1 title"
791
788
  },
792
789
  "playbook.stage0.action1.description": {
793
- value: "Resumir el dolor en un párrafo que puedas repetir a los socios.",
794
- description: "Action description for stage 0 problem narrative"
790
+ value: "Résumer la douleur en un paragraphe que vous pouvez répéter aux partenaires.",
791
+ description: "Stage 0 action 1 description"
795
792
  },
796
793
  "playbook.stage1.action0.title": {
797
- value: "Ciclo de retroalimentación del prototipo",
798
- description: "Action title for stage 1 prototype iteration"
794
+ value: "Boucle de retours sur le prototype",
795
+ description: "Stage 1 action 0 title"
799
796
  },
800
797
  "playbook.stage1.action0.description": {
801
- value: "Entregar un prototipo de baja fidelidad y recopilar 3 rondas de reacciones.",
802
- description: "Action description for stage 1 prototype iteration"
798
+ value: "Livrer un prototype basse fidélité et recueillir 3 tours de réactions.",
799
+ description: "Stage 1 action 0 description"
803
800
  },
804
801
  "playbook.stage1.action1.title": {
805
- value: "Capturar señales de recomendación",
806
- description: "Action title for stage 1 referral tracking"
802
+ value: "Capturer les signaux de recommandation",
803
+ description: "Stage 1 action 1 title"
807
804
  },
808
805
  "playbook.stage1.action1.description": {
809
- value: "Preguntar a cada tester quién más debería ver la demo.",
810
- description: "Action description for stage 1 referral tracking"
806
+ value: "Demander à chaque testeur qui d'autre devrait voir la démo.",
807
+ description: "Stage 1 action 1 description"
811
808
  },
812
809
  "playbook.stage2.action0.title": {
813
- value: "Definir lista de verificación de activación",
814
- description: "Action title for stage 2 activation definition"
810
+ value: "Définir la checklist d'activation",
811
+ description: "Stage 2 action 0 title"
815
812
  },
816
813
  "playbook.stage2.action0.description": {
817
- value: "Documentar los 3 pasos que los usuarios deben completar para obtener valor.",
818
- description: "Action description for stage 2 activation definition"
814
+ value: "Documenter les 3 étapes que les utilisateurs doivent terminer pour obtenir de la valeur.",
815
+ description: "Stage 2 action 0 description"
819
816
  },
820
817
  "playbook.stage2.action1.title": {
821
- value: "Sincronización semanal con usuarios",
822
- description: "Action title for stage 2 user communication"
818
+ value: "Synchronisation hebdomadaire avec les utilisateurs",
819
+ description: "Stage 2 action 1 title"
823
820
  },
824
821
  "playbook.stage2.action1.description": {
825
- value: "Organizar una llamada recurrente con tus 5 testers más activos.",
826
- description: "Action description for stage 2 user communication"
822
+ value: "Organiser un appel récurrent avec vos 5 testeurs les plus actifs.",
823
+ description: "Stage 2 action 1 description"
827
824
  },
828
825
  "playbook.stage3.action0.title": {
829
- value: "Realizar un estudio de retención",
830
- description: "Action title for stage 3 retention analysis"
826
+ value: "Mener une étude de rétention",
827
+ description: "Stage 3 action 0 title"
831
828
  },
832
829
  "playbook.stage3.action0.description": {
833
- value: "Entrevistar a 3 usuarios retenidos y publicar sus métricas antes/después.",
834
- description: "Action description for stage 3 retention analysis"
830
+ value: "Interviewer 3 utilisateurs retenus et publier leurs métriques avant/après.",
831
+ description: "Stage 3 action 0 description"
835
832
  },
836
833
  "playbook.stage3.action1.title": {
837
- value: "Revisión ligera de incidentes",
838
- description: "Action title for stage 3 reliability review"
834
+ value: "Revue légère d'incidents",
835
+ description: "Stage 3 action 1 title"
839
836
  },
840
837
  "playbook.stage3.action1.description": {
841
- value: "Revisar los últimos 2 problemas de fiabilidad y capturar las correcciones.",
842
- description: "Action description for stage 3 reliability review"
838
+ value: "Examiner les 2 derniers incidents de fiabilité et capturer les correctifs.",
839
+ description: "Stage 3 action 1 description"
843
840
  },
844
841
  "playbook.stage4.action0.title": {
845
- value: "Codificar un bucle de crecimiento",
846
- description: "Action title for stage 4 growth loop setup"
842
+ value: "Codifier une boucle de croissance",
843
+ description: "Stage 4 action 0 title"
847
844
  },
848
845
  "playbook.stage4.action0.description": {
849
- value: "Elegir un bucle (SEO, referencias, outbound) y documentar responsables + entradas.",
850
- description: "Action description for stage 4 growth loop setup"
846
+ value: "Choisir une boucle (SEO, recommandations, outbound) et documenter les responsables + entrées.",
847
+ description: "Stage 4 action 0 description"
851
848
  },
852
849
  "playbook.stage4.action1.title": {
853
- value: "Crear mapa de contratación",
854
- description: "Action title for stage 4 hiring plan"
850
+ value: "Créer la carte de recrutement",
851
+ description: "Stage 4 action 1 title"
855
852
  },
856
853
  "playbook.stage4.action1.description": {
857
- value: "Listar los roles especializados necesarios para los próximos 2 trimestres.",
858
- description: "Action description for stage 4 hiring plan"
854
+ value: "Lister les rôles spécialisés nécessaires pour les 2 prochains trimestres.",
855
+ description: "Stage 4 action 1 description"
859
856
  },
860
857
  "playbook.stage5.action0.title": {
861
- value: "Brief de preparación para socios",
862
- description: "Action title for stage 5 partner preparation"
858
+ value: "Brief de préparation partenaire",
859
+ description: "Stage 5 action 0 title"
863
860
  },
864
861
  "playbook.stage5.action0.description": {
865
- value: "Documentar tipos de socios, propuestas de valor y pasos de incorporación.",
866
- description: "Action description for stage 5 partner preparation"
862
+ value: "Documenter les types de partenaires, propositions de valeur et étapes d'intégration.",
863
+ description: "Stage 5 action 0 description"
867
864
  },
868
865
  "playbook.stage5.action1.title": {
869
- value: "Portafolio de experimentos de expansión",
870
- description: "Action title for stage 5 expansion planning"
866
+ value: "Portefeuille d'expériences d'expansion",
867
+ description: "Stage 5 action 1 title"
871
868
  },
872
869
  "playbook.stage5.action1.description": {
873
- value: "Listar los 3 principales mercados o líneas de producto con responsables.",
874
- description: "Action description for stage 5 expansion planning"
870
+ value: "Lister les 3 principaux marchés ou lignes de produits avec les responsables.",
871
+ description: "Stage 5 action 1 description"
875
872
  },
876
873
  "playbook.stage6.action0.title": {
877
- value: "Realizar una revisión costo-valor",
878
- description: "Action title for stage 6 margin audit"
874
+ value: "Mener une revue coût-valeur",
875
+ description: "Stage 6 action 0 title"
879
876
  },
880
877
  "playbook.stage6.action0.description": {
881
- value: "Auditar cada superficie principal por impacto en márgenes.",
882
- description: "Action description for stage 6 margin audit"
878
+ value: "Auditer chaque surface majeure pour l’impact sur les marges.",
879
+ description: "Stage 6 action 0 description"
883
880
  },
884
881
  "playbook.stage6.action1.title": {
885
- value: "Definir la apuesta de renovación",
886
- description: "Action title for stage 6 reinvention track"
882
+ value: "Définir le pari de renouvellement",
883
+ description: "Stage 6 action 1 title"
887
884
  },
888
885
  "playbook.stage6.action1.description": {
889
- value: "Elegir una pista de reinvención o descontinuación y establecer puntos de control.",
890
- description: "Action description for stage 6 reinvention track"
886
+ value: "Choisir une piste de réinvention ou d'arrêt et définir des points de contrôle.",
887
+ description: "Stage 6 action 1 description"
891
888
  },
892
889
  "ceremony.stage0.title": {
893
- value: "Chispa de descubrimiento",
894
- description: "Ceremony title for stage 0"
890
+ value: "Étincelle de découverte",
891
+ description: "Stage 0 ceremony title"
895
892
  },
896
893
  "ceremony.stage0.copy": {
897
- value: "Comparte la cita de dolor más impactante con tu equipo. Enmárcala, celebra el enfoque.",
898
- description: "Ceremony copy for stage 0"
894
+ value: "Partagez la citation la plus percutante avec votre équipe. Encadrez-la, célébrez le focus.",
895
+ description: "Stage 0 ceremony copy"
899
896
  },
900
897
  "ceremony.stage1.title": {
901
- value: "Resonancia de la solución",
902
- description: "Ceremony title for stage 1"
898
+ value: "Résonance de la solution",
899
+ description: "Stage 1 ceremony title"
903
900
  },
904
901
  "ceremony.stage1.copy": {
905
- value: "Graba un breve screencast contando la historia antes/después a tu futuro yo.",
906
- description: "Ceremony copy for stage 1"
902
+ value: "Enregistrez un court partage d'écran racontant l'histoire avant/après à votre futur vous.",
903
+ description: "Stage 1 ceremony copy"
907
904
  },
908
905
  "ceremony.stage2.title": {
909
- value: "Brindis por la tracción",
910
- description: "Ceremony title for stage 2"
906
+ value: "Toast à la traction",
907
+ description: "Stage 2 ceremony title"
911
908
  },
912
909
  "ceremony.stage2.copy": {
913
- value: "Brinda por tus primeros 20 usuarios realesdi sus nombres, diles por qué importan.",
914
- description: "Ceremony copy for stage 2"
910
+ value: "Portez un toast à vos 20 premiers vrais utilisateurs dites leurs noms, dites-leur pourquoi ils comptent.",
911
+ description: "Stage 2 ceremony copy"
915
912
  },
916
913
  "ceremony.stage3.title": {
917
- value: "Señal de fuego PMF",
918
- description: "Ceremony title for stage 3"
914
+ value: "Signal PMF",
915
+ description: "Stage 3 ceremony title"
919
916
  },
920
917
  "ceremony.stage3.copy": {
921
- value: "Escribe una carta a tu futuro yo de la Serie A describiendo la atracción que sientes hoy.",
922
- description: "Ceremony copy for stage 3"
918
+ value: "Écrivez une lettre à votre futur vous de la Série A décrivant l'attraction que vous ressentez aujourd'hui.",
919
+ description: "Stage 3 ceremony copy"
923
920
  },
924
921
  "ceremony.stage4.title": {
925
- value: "Sistemas de escala",
926
- description: "Ceremony title for stage 4"
922
+ value: "Systèmes d'échelle",
923
+ description: "Stage 4 ceremony title"
927
924
  },
928
925
  "ceremony.stage4.copy": {
929
- value: "Invita al equipo a mapear el viaje desde el primer usuario hasta la máquina repetible.",
930
- description: "Ceremony copy for stage 4"
926
+ value: "Invitez l'équipe à cartographier le parcours du premier utilisateur à la machine répétable.",
927
+ description: "Stage 4 ceremony copy"
931
928
  },
932
929
  "ceremony.stage5.title": {
933
- value: "Umbral de la plataforma",
934
- description: "Ceremony title for stage 5"
930
+ value: "Seuil de la plateforme",
931
+ description: "Stage 5 ceremony title"
935
932
  },
936
933
  "ceremony.stage5.copy": {
937
- value: "Organiza un círculo de sociosinvita a los aliados a compartir lo que necesitan de tu plataforma.",
938
- description: "Ceremony copy for stage 5"
934
+ value: "Organisez un cercle de partenaires invitez les alliés à partager ce dont ils ont besoin de votre plateforme.",
935
+ description: "Stage 5 ceremony copy"
939
936
  },
940
937
  "ceremony.stage6.title": {
941
- value: "Cumbre de renovación",
942
- description: "Ceremony title for stage 6"
938
+ value: "Sommet du renouvellement",
939
+ description: "Stage 6 ceremony title"
943
940
  },
944
941
  "ceremony.stage6.copy": {
945
- value: "Haz una pausa para honrar lo que te trajo aquí, luego comprómetete públicamente con la próxima reinvención.",
946
- description: "Ceremony copy for stage 6"
942
+ value: "Faites une pause pour honorer ce qui vous a amené ici, puis engagez-vous publiquement pour la prochaine réinvention.",
943
+ description: "Stage 6 ceremony copy"
947
944
  },
948
945
  "library.stage0.item0": {
949
- value: "Resumir entrevistas y sintetizar insights de IC.",
950
- description: "Library tool description for stage 0 item 0"
946
+ value: "Résumer les entretiens et synthétiser les insights IC.",
947
+ description: "Stage 0 library item 0"
951
948
  },
952
949
  "library.stage0.item1": {
953
- value: "Crear storyboards de baja fidelidad sin código personalizado.",
954
- description: "Library tool description for stage 0 item 1"
950
+ value: "Créer des storyboards basse fidélité sans code personnalisé.",
951
+ description: "Stage 0 library item 1"
955
952
  },
956
953
  "library.stage1.item0": {
957
- value: "Controlar funcionalidades del prototipo detrás de flags ligeros.",
958
- description: "Library tool description for stage 1 item 0"
954
+ value: "Contrôler les fonctionnalités prototype derrière des flags légers.",
955
+ description: "Stage 1 library item 0"
959
956
  },
960
957
  "library.stage1.item1": {
961
- value: "Capturar señales de cuestionario para scoring temprano.",
962
- description: "Library tool description for stage 1 item 1"
958
+ value: "Capturer les signaux de questionnaire pour un scoring précoce.",
959
+ description: "Stage 1 library item 1"
963
960
  },
964
961
  "library.stage2.item0": {
965
- value: "Instrumentar rutas de activación + cohortes.",
966
- description: "Library tool description for stage 2 item 0"
962
+ value: "Instrumenter les parcours d'activation + cohortes.",
963
+ description: "Stage 2 library item 0"
967
964
  },
968
965
  "library.stage2.item1": {
969
- value: "Recopilar trazas y métricas mínimas viables.",
970
- description: "Library tool description for stage 2 item 1"
966
+ value: "Collecter les traces et métriques minimales viables.",
967
+ description: "Stage 2 library item 1"
971
968
  },
972
969
  "library.stage3.item0": {
973
- value: "Detectar automáticamente brechas de contrato y mejoras de spec.",
974
- description: "Library tool description for stage 3 item 0"
970
+ value: "Détecter automatiquement les lacunes de contrat et améliorations de spec.",
971
+ description: "Stage 3 library item 0"
975
972
  },
976
973
  "library.stage3.item1": {
977
- value: "Generar orientación enfocada en retención a escala.",
978
- description: "Library tool description for stage 3 item 1"
974
+ value: "Générer des conseils axés sur la rétention à grande échelle.",
975
+ description: "Stage 3 library item 1"
979
976
  },
980
977
  "library.stage4.item0": {
981
- value: "Orquestación de experimentos con barandillas.",
982
- description: "Library tool description for stage 4 item 0"
978
+ value: "Orchestration d'expériences avec garde-fous.",
979
+ description: "Stage 4 library item 0"
983
980
  },
984
981
  "library.stage4.item1": {
985
- value: "Estabilizar infraestructura y SLOs a medida que los equipos se dividen.",
986
- description: "Library tool description for stage 4 item 1"
982
+ value: "Stabiliser l’infra et les SLOs au fur et à mesure que les équipes se divisent.",
983
+ description: "Stage 4 library item 1"
987
984
  },
988
985
  "library.stage5.item0": {
989
- value: "Automatizar flujos de trabajo de socios e integraciones.",
990
- description: "Library tool description for stage 5 item 0"
986
+ value: "Automatiser les workflows partenaires et intégrations.",
987
+ description: "Stage 5 library item 0"
991
988
  },
992
989
  "library.stage5.item1": {
993
- value: "Exponer incorporación de socios gestionada vía Studio.",
994
- description: "Library tool description for stage 5 item 1"
990
+ value: "Exposer l'intégration partenaire gérée via Studio.",
991
+ description: "Stage 5 library item 1"
995
992
  },
996
993
  "library.stage6.item0": {
997
- value: "Modelar escenarios de margen y apuestas de reinversión.",
998
- description: "Library tool description for stage 6 item 0"
994
+ value: "Modéliser les scénarios de marge et paris de réinvestissement.",
995
+ description: "Stage 6 library item 0"
999
996
  },
1000
997
  "library.stage6.item1": {
1001
- value: "Estandarizar rituales de renovación y automatización.",
1002
- description: "Library tool description for stage 6 item 1"
998
+ value: "Standardiser les rituels de renouvellement et l'automatisation.",
999
+ description: "Stage 6 library item 1"
1003
1000
  },
1004
1001
  "engine.fallbackAction.title": {
1005
- value: "Avanzar en {focus}",
1006
- description: "Fallback action title when no specific action exists",
1007
- placeholders: [{ name: "focus", type: "string" }]
1002
+ value: "Avancer sur {focus}",
1003
+ description: "Fallback action title with focus placeholder"
1008
1004
  },
1009
1005
  "engine.fallbackAction.description": {
1010
- value: 'Identificar una tarea que mejore "{focus}" esta semana.',
1011
- description: "Fallback action description when no specific action exists",
1012
- placeholders: [{ name: "focus", type: "string" }]
1006
+ value: "Identifier une tâche qui améliorera « {focus} » cette semaine.",
1007
+ description: "Fallback action description with focus placeholder"
1013
1008
  }
1014
1009
  }
1015
1010
  });
@@ -1276,57 +1271,26 @@ var staticPlaybooks = [
1276
1271
  var stagePlaybooks = staticPlaybooks;
1277
1272
  var stage_playbooks_default = stagePlaybooks;
1278
1273
 
1279
- // src/recommendations/recommendation-engine.ts
1280
- var PLAYBOOK_MAP = new Map(stage_playbooks_default.map((entry) => [
1274
+ // src/ceremony/ceremony-designer.ts
1275
+ var CEREMONY_MAP = new Map(stage_playbooks_default.map((entry) => [
1281
1276
  entry.stage,
1282
- {
1283
- ...entry,
1284
- stage: entry.stage
1285
- }
1277
+ entry.ceremony
1286
1278
  ]));
1287
1279
 
1288
- class LifecycleRecommendationEngine {
1289
- playbooks;
1280
+ class LifecycleCeremonyDesigner {
1281
+ ceremonies;
1290
1282
  constructor(overrides) {
1291
- this.playbooks = overrides?.length ? new Map(overrides.map((entry) => [entry.stage, entry])) : PLAYBOOK_MAP;
1283
+ this.ceremonies = overrides?.length ? new Map(overrides.map((entry) => [entry.stage, entry.ceremony])) : CEREMONY_MAP;
1292
1284
  }
1293
- generate(assessment, options = {}) {
1294
- const { locale, limit: rawLimit, upcomingMilestones } = options;
1295
- const limit = rawLimit ?? 3;
1296
- const entry = locale ? resolveLocalizedPlaybook(assessment.stage, locale) : this.playbooks.get(assessment.stage) ?? createFallbackPlaybook(assessment.stage);
1297
- const actions = (entry.actions ?? []).slice(0, limit);
1298
- const finalActions = actions.length > 0 ? actions : fallbackActions(assessment, limit, locale);
1299
- return {
1300
- assessmentId: assessment.generatedAt,
1301
- stage: assessment.stage,
1302
- actions: finalActions,
1303
- upcomingMilestones: upcomingMilestones ?? [],
1304
- ceremony: entry.ceremony
1305
- };
1285
+ design(stage, locale) {
1286
+ if (locale) {
1287
+ const localized = getLocalizedStagePlaybooks(locale);
1288
+ const entry = localized.find((p) => p.stage === stage);
1289
+ return entry?.ceremony;
1290
+ }
1291
+ return this.ceremonies.get(stage);
1306
1292
  }
1307
1293
  }
1308
- function resolveLocalizedPlaybook(stage, locale) {
1309
- const localized = getLocalizedStagePlaybooks(locale);
1310
- return localized.find((p) => p.stage === stage) ?? createFallbackPlaybook(stage, locale);
1311
- }
1312
- var createFallbackPlaybook = (stage, locale) => ({
1313
- stage,
1314
- actions: [],
1315
- focusAreas: locale ? getLocalizedStagePlaybooks(locale).find((p) => p.stage === stage)?.focusAreas ?? LIFECYCLE_STAGE_META[stage].focusAreas : LIFECYCLE_STAGE_META[stage].focusAreas
1316
- });
1317
- var fallbackActions = (assessment, limit, locale) => {
1318
- const i18n = locale ? createLifecycleAdvisorI18n(locale) : undefined;
1319
- return (assessment.focusAreas ?? LIFECYCLE_STAGE_META[assessment.stage].focusAreas).slice(0, limit).map((focus, index) => ({
1320
- id: `fallback-${assessment.stage}-${index}`,
1321
- stage: assessment.stage,
1322
- title: i18n ? i18n.t("engine.fallbackAction.title", { focus }) : `Advance ${focus}`,
1323
- description: i18n ? i18n.t("engine.fallbackAction.description", { focus }) : `Identify one task that will improve "${focus}" this week.`,
1324
- priority: index + 1,
1325
- estimatedImpact: "low",
1326
- effortLevel: "s",
1327
- category: "product"
1328
- }));
1329
- };
1330
1294
  // src/data/library-stage-map.ts
1331
1295
  function getLocalizedLibraryStageMap(locale) {
1332
1296
  const i18n = createLifecycleAdvisorI18n(locale);
@@ -1447,7 +1411,6 @@ var staticLibraryStageMap = [
1447
1411
  ];
1448
1412
  var libraryStageMap = staticLibraryStageMap;
1449
1413
  var library_stage_map_default = libraryStageMap;
1450
-
1451
1414
  // src/recommendations/library-recommender.ts
1452
1415
  var LIBRARY_MAP = new Map(library_stage_map_default.map((entry) => [entry.stage, entry.items]));
1453
1416
 
@@ -1468,26 +1431,60 @@ class ContractSpecLibraryRecommender {
1468
1431
  return items.slice(0, limit);
1469
1432
  }
1470
1433
  }
1471
- // src/ceremony/ceremony-designer.ts
1472
- var CEREMONY_MAP = new Map(stage_playbooks_default.map((entry) => [
1434
+ // src/recommendations/recommendation-engine.ts
1435
+ import {
1436
+ LIFECYCLE_STAGE_META
1437
+ } from "@contractspec/lib.lifecycle";
1438
+ var PLAYBOOK_MAP = new Map(stage_playbooks_default.map((entry) => [
1473
1439
  entry.stage,
1474
- entry.ceremony
1440
+ {
1441
+ ...entry,
1442
+ stage: entry.stage
1443
+ }
1475
1444
  ]));
1476
1445
 
1477
- class LifecycleCeremonyDesigner {
1478
- ceremonies;
1446
+ class LifecycleRecommendationEngine {
1447
+ playbooks;
1479
1448
  constructor(overrides) {
1480
- this.ceremonies = overrides?.length ? new Map(overrides.map((entry) => [entry.stage, entry.ceremony])) : CEREMONY_MAP;
1449
+ this.playbooks = overrides?.length ? new Map(overrides.map((entry) => [entry.stage, entry])) : PLAYBOOK_MAP;
1481
1450
  }
1482
- design(stage, locale) {
1483
- if (locale) {
1484
- const localized = getLocalizedStagePlaybooks(locale);
1485
- const entry = localized.find((p) => p.stage === stage);
1486
- return entry?.ceremony;
1487
- }
1488
- return this.ceremonies.get(stage);
1451
+ generate(assessment, options = {}) {
1452
+ const { locale, limit: rawLimit, upcomingMilestones } = options;
1453
+ const limit = rawLimit ?? 3;
1454
+ const entry = locale ? resolveLocalizedPlaybook(assessment.stage, locale) : this.playbooks.get(assessment.stage) ?? createFallbackPlaybook(assessment.stage);
1455
+ const actions = (entry.actions ?? []).slice(0, limit);
1456
+ const finalActions = actions.length > 0 ? actions : fallbackActions(assessment, limit, locale);
1457
+ return {
1458
+ assessmentId: assessment.generatedAt,
1459
+ stage: assessment.stage,
1460
+ actions: finalActions,
1461
+ upcomingMilestones: upcomingMilestones ?? [],
1462
+ ceremony: entry.ceremony
1463
+ };
1489
1464
  }
1490
1465
  }
1466
+ function resolveLocalizedPlaybook(stage, locale) {
1467
+ const localized = getLocalizedStagePlaybooks(locale);
1468
+ return localized.find((p) => p.stage === stage) ?? createFallbackPlaybook(stage, locale);
1469
+ }
1470
+ var createFallbackPlaybook = (stage, locale) => ({
1471
+ stage,
1472
+ actions: [],
1473
+ focusAreas: locale ? getLocalizedStagePlaybooks(locale).find((p) => p.stage === stage)?.focusAreas ?? LIFECYCLE_STAGE_META[stage].focusAreas : LIFECYCLE_STAGE_META[stage].focusAreas
1474
+ });
1475
+ var fallbackActions = (assessment, limit, locale) => {
1476
+ const i18n = locale ? createLifecycleAdvisorI18n(locale) : undefined;
1477
+ return (assessment.focusAreas ?? LIFECYCLE_STAGE_META[assessment.stage].focusAreas).slice(0, limit).map((focus, index) => ({
1478
+ id: `fallback-${assessment.stage}-${index}`,
1479
+ stage: assessment.stage,
1480
+ title: i18n ? i18n.t("engine.fallbackAction.title", { focus }) : `Advance ${focus}`,
1481
+ description: i18n ? i18n.t("engine.fallbackAction.description", { focus }) : `Identify one task that will improve "${focus}" this week.`,
1482
+ priority: index + 1,
1483
+ estimatedImpact: "low",
1484
+ effortLevel: "s",
1485
+ category: "product"
1486
+ }));
1487
+ };
1491
1488
  export {
1492
1489
  getLocalizedStagePlaybooks,
1493
1490
  getLocalizedLibraryStageMap,