Skip to content

Latest commit

 

History

History
252 lines (214 loc) · 9.61 KB

File metadata and controls

252 lines (214 loc) · 9.61 KB

Modelo DDD - Módulo Construction

Navegación Bilingüe: English · Español (este documento) Fase Requerida: Fase 3 — Construcción Audiencia Principal: Arquitectos, Desarrolladores, Agentes IA

1. Lenguaje Ubicuo (Ubiquitous Language)

Términos estrictos compartidos entre el negocio y el área técnica dentro de este contexto:

  • Implementation Cycle (Ciclo de Implementación): El contenedor transaccional de un esfuerzo de desarrollo temporal (equivalente a un Sprint o Milestone).
  • Technical Story (Historia Técnica): Una unidad atómica de ejecución que toman los desarrolladores o Agentes AI. Se origina a partir de una Historia de Usuario, Contrato Técnico aprobado o checkpoint de iniciativa (en modo solo-iniciativa).
  • Code Branch (Rama de Código): Referencia lógica a la rama física en el repositorio Git (ej. GitHub/GitLab).
  • Peer Review: Compuerta formal de revisión de código, poblada asíncronamente vía webhooks (ej. un Pull Request).
  • Construction Gate: Criterio formal o "Definition of Done" que asegura que todo el código tiene revisión y cobertura antes de permitir la transición a QA.
  • Bloqueo de Refinamiento (RefinementLock): Bloqueo exclusivo adquirido durante sesiones de refinamiento del backlog para prevenir ediciones concurrentes. Se libera tras commit o 30min de inactividad. Aplicable solo en modo generar. En modo solo-iniciativa, no se necesita bloqueo de refinamiento — el ordenamiento de checkpoints se gestiona a nivel de iniciativa.

2. Mapas Conceptuales y Agregados (Mermaid)

2.0. Leyendas y Glosario Visual

Símbolo/Estereotipo Significado
<<Aggregate Root>> Entidad raíz transaccional. Gobierna la persistencia y consistencia de las entidades internas.
<<Entity>> Objeto de dominio con identidad única, dependiente de su Aggregate Root.
<<Value Object>> Objeto inmutable sin identidad propia. Representa una propiedad estructural.
<<Shared Kernel Shell>> Módulo transversal externo al dominio, inyectado por infraestructura.
*-- (Línea sólida) Composición. El elemento hijo no puede existir sin el padre.
..> (Línea punteada) Dependencia. El elemento depende de interactúa con el otro componente para delegar acciones.

Tip

Opciones de Visualización: Si los diagramas se ven pequeños en su visor Markdown actual, copie el bloque de código en el Mermaid Live Editor para habilitar zoom, paneo infinito y exportación en alta resolución (SVG/PNG).

2.1. Vista 1: Core de Negocio (Agregados y Entidades)

classDiagram
    class ImplementationCycle {
        <<Aggregate Root>>
        +UUID id
        +UUID blueprintId
        +String tenantId
        +String name
        +String sprintGoal
        +Date startDate
        +Date endDate
        +Int totalCapacityHours
        +Int completedPoints
        +CycleStatus status
        +List~UUID~ technicalStoryIds
        +List~ExternalReference~ externalRefs
        +startCycle(UUID umsUserId)
        +freezeCode(UUID umsUserId)
        +updateSchedule(Date start, Date end, UUID umsUserId)
        +recalculateMetrics()
        +closeCycle(ConstructionGate, UUID umsUserId)
    }

    class TechnicalStory {
        <<Aggregate Root>>
        +UUID id
        +UUID cycleId
        +UUID parentSourceId
        +StoryStatus status
        +UUID peerReviewId
        +UUID developerId_umsUserId
        +Int complexity
        +Int estimatedHours
        +Int loggedHours
        +List~String~ labels
        +List~ExternalReference~ externalRefs
        +assignDeveloper(UUID umsUserId)
        +logTime(Int hours, UUID umsUserId)
        +updateProgress(UUID umsUserId)
        +linkBranch(CodeBranch)
        +submitForReview(UUID umsUserId)
        +markAsDone(UUID umsUserId)
    }

    class CodeBranch {
        <<Value Object>>
        +String repositoryUrl
        +String branchName
        +String latestCommitHash
    }

    class PeerReview {
        <<Aggregate Root>>
        +UUID id
        +UUID technicalStoryId
        +String externalId
        +ReviewStatus reviewStatus
        +String pullRequestUrl
        +String sourceBranch
        +String targetBranch
        +String ciPipelineStatus
        +Boolean mergeConflict
        +List~ExternalReference~ externalRefs
        +updateCiStatus(String status)
        +flagConflict()
        +registerReviewDecision(ReviewerDecision)
    }

    class ReviewerDecision {
        <<Value Object>>
        +String reviewerId_umsUserId
        +String comment
        +Date approvedAt
    }

    class ExternalReference {
        <<Value Object>>
        +ExternalSystem system
        +String externalId
        +String url
        +ReferenceType type
        +String label
        +Date linkedAt
        +Map metadata
    }

    ImplementationCycle "1" --> "0..*" TechnicalStory : orquesta
    TechnicalStory "1" *-- "0..1" CodeBranch : mapeado a
    TechnicalStory "1" --> "0..1" PeerReview : referenciado por
    PeerReview "1" *-- "0..*" ReviewerDecision : contiene
    ImplementationCycle "1" *-- "0..*" ExternalReference : mapeado a
    TechnicalStory "1" *-- "0..*" ExternalReference : mapeado a
    PeerReview "1" *-- "0..*" ExternalReference : mapeado a
Loading

2.2. Vista 2: Componentes de Workflow y Auditoría

classDiagram
    class RequirementChecklist {
        <<Value Object>>
        +List~RequirementItem~ items
        +isReadyForApproval() Boolean
    }

    class RequirementItem {
        <<Value Object>>
        +String code
        +Boolean isMandatory
        +RequirementStatus status
    }

    class StateTransition {
        <<Value Object>>
        +CycleStatus fromState
        +CycleStatus toState
        +Date transitionDate
        +String triggeredBy
    }

    class ConstructionGate {
        <<Value Object>>
        +String techLeadId
        +GateDecision decision
        +Date decidedAt
    }

    class AuditControl {
        <<Value Object>>
        +String createdBy
        +Date createdAt
    }

    class RefinementLock {
        <<Value Object>>
        +UUID backlogId
        +UUID acquiredBy_umsUserId
        +Date acquiredAt
        +Date expiresAt
        +Boolean isReleased
        +release()
        +isExpired() Boolean
    }

    class ImplementationCycle {
        <<Aggregate Root>>
    }

    class TechnicalStory {
        <<Aggregate Root>>
    }

    ImplementationCycle "1" *-- "1" RequirementChecklist : verifica contra
    RequirementChecklist "1" *-- "1..*" RequirementItem : contiene
    ImplementationCycle "1" *-- "1" AuditControl : auditada por
    ImplementationCycle "1" *-- "0..*" StateTransition : historial de estados
    ImplementationCycle "1" *-- "0..1" ConstructionGate : gobernada por
    TechnicalStory "1" *-- "1" AuditControl : auditada por
    ImplementationCycle "1" *-- "0..1" RefinementLock : bloqueado por
Loading

Nota de Modo de RefinementLock: Aplicable solo en modo generar. En modo solo-iniciativa, no se necesita bloqueo de refinamiento — el ordenamiento de checkpoints se gestiona a nivel de iniciativa.

2.3. Vista 3: Infraestructura Transversal (Shells)

classDiagram
    class WorkflowEngine {
        <<Shared Kernel Shell>>
        +validateTransition()
        +evaluateApprovalGate()
    }

    class TenantConfigShell {
        <<Shared Kernel Shell>>
        +getTenantWorkflowRules()
    }

    class IntegrationFabric {
        <<Shared Kernel Shell>>
        +listenToGithubWebhooks()
        +listenToGitlabWebhooks()
    }

    class UMS_SDK {
        <<Cross-Cutting>>
        +RequiresDomainAccess()
    }

    class PeerReview {
        <<Aggregate Root>>
    }

    class ImplementationCycle {
        <<Aggregate Root>>
    }

    ImplementationCycle ..> TenantConfigShell : lee reglas opcionales
    ImplementationCycle ..> WorkflowEngine : delega lógica de estados
    ImplementationCycle ..> UMS_SDK : asegurada vía
    PeerReview ..> IntegrationFabric : hidratada asíncronamente vía
Loading

3. Diseño Táctico

3.1. Aggregate Roots (Agregados Pequeños)

El módulo emplea el patrón de Agregados Pequeños (Small Aggregates) estipulado en las reglas corporativas Evolith (R-21) para maximizar el rendimiento y prevenir bloqueos:

  1. ImplementationCycle: No contiene historias anidadas físicamente, sino una lista List<UUID> technicalStoryIds.
  2. TechnicalStory: Tarea aislada en la que un desarrollador o IA trabaja.
  3. PeerReview: Elevado a Aggregate Root independiente para que los webhooks externos de repositorios Git (vía IntegrationFabric) puedan impactar su estado asíncronamente sin bloquear transacciones pesadas en el ImplementationCycle o la TechnicalStory.

3.2. Value Objects

  • RequirementChecklist: (Regla corporativa R-22). Valida flujos dinámicos inyectados por la configuración del Tenant de forma local al dominio.
  • CodeBranch: Objeto inmutable que define explícitamente en qué repositorio y rama vive el trabajo.
  • RefinementLock: Value Object para sesiones de refinamiento exclusivas del backlog (US-CON-012). Se adquiere al inicio de sesión, se libera tras commit o 30min de inactividad. Aplicable solo en modo generar. En modo solo-iniciativa, no se necesita bloqueo de refinamiento — el ordenamiento de checkpoints se gestiona a nivel de iniciativa.

3.3. Integración Externa y Webhooks (R-20)

A diferencia de fases anteriores, Construction depende enormemente del mundo real. El IntegrationFabric asume un rol protagónico, capturando webhooks de GitHub, GitLab o Bitbucket y traduciéndolos a comandos de dominio (ej. UpdatePeerReviewCommand) que hidratan los agregados locales de PeerReview.