7.1: MAN.3 Project Management


Process Definition

Purpose

MAN.3 Purpose: To identify, establish, coordinate, and monitor the activities, tasks, and resources necessary for a project to produce a product.

Outcomes

Outcome Description
O1 The scope of the work for the project is defined
O2 The feasibility of achieving the goals of the project with available resources and constraints is evaluated
O3 The activities and resources necessary to complete the work are sized and estimated
O4 Interfaces within the project, and with other projects and organizational units, are identified and monitored
O5 Plans for the execution of the project are developed, implemented and maintained
O6 Progress of the project is monitored and reported
O7 Adjustment is performed when project goals are not achieved

Base Practices with AI Integration

BP Base Practice AI Level AI Application
BP1 Define the scope of work L1 Scope decomposition
BP2 Define project life cycle L1 Lifecycle templates
BP3 Evaluate feasibility of the project L1-L2 Feasibility analysis
BP4 Define and monitor work packages L1-L2 WBS generation
BP5 Define and monitor project estimates and resources L2 AI-powered estimation
BP6 Define and monitor required skills, knowledge, and experience L1 Skill matching
BP7 Define and monitor project interfaces and agreed commitments L1 Dependency mapping
BP8 Define and monitor project schedule L2 Schedule optimization
BP9 Ensure consistency L2 Consistency checking
BP10 Review and report progress of the project L2-L3 Automated tracking, reporting

AI-Powered Project Estimation

Estimation Model

"""
AI-assisted project estimation for embedded software projects.
"""

from dataclasses import dataclass
from typing import List, Dict, Optional, Tuple
import numpy as np
from sklearn.ensemble import RandomForestRegressor

@dataclass
class ProjectFeatures:
    """Project features for estimation."""
    # Size metrics
    requirement_count: int
    function_point_estimate: int
    lines_of_code_estimate: int

    # Complexity factors
    interface_count: int
    safety_level: str  # ASIL-A to ASIL-D
    security_level: str  # CAL 1-4
    reuse_percentage: float

    # Team factors
    team_size: int
    team_experience: str  # junior, mixed, senior
    domain_expertise: str  # low, medium, high

    # Technical factors
    target_platform: str
    real_time_constraints: bool
    misra_compliance: bool

@dataclass
class Estimate:
    """Project estimate result."""
    effort_hours: float
    duration_weeks: float
    confidence_low: float
    confidence_high: float
    confidence_level: float
    risk_factors: List[str]
    assumptions: List[str]


class ProjectEstimator:
    """AI-powered project effort estimation.

    Note: RandomForestRegressor requires training on organizational
    historical data for accurate predictions. Calibrate regularly.
    """

    def __init__(self):
        self.model = self._load_model()
        self.historical_data = self._load_historical_data()

    def _load_model(self):
        """Load trained estimation model."""
        # In production, load from saved model file
        return RandomForestRegressor(n_estimators=100)

    def _load_historical_data(self) -> List[Dict]:
        """Load historical project data for calibration."""
        # Sample historical projects
        return [
            {'req_count': 50, 'fp': 150, 'effort': 2000, 'duration': 20},
            {'req_count': 100, 'fp': 300, 'effort': 4500, 'duration': 32},
            {'req_count': 200, 'fp': 600, 'effort': 10000, 'duration': 48},
            # ... more historical data
        ]

    def estimate(self, features: ProjectFeatures) -> Estimate:
        """Generate project estimate using AI model."""

        # Feature engineering
        X = self._extract_features(features)

        # Base estimate from model
        base_effort = self._calculate_base_effort(features)

        # Apply adjustment factors
        adjustments = self._calculate_adjustments(features)
        adjusted_effort = base_effort * adjustments['total_factor']

        # Calculate duration
        optimal_team = self._calculate_optimal_team(adjusted_effort, features)
        duration = adjusted_effort / (optimal_team * 40)  # 40 hours/week

        # Confidence interval
        confidence = self._calculate_confidence(features, adjusted_effort)

        # Identify risks
        risks = self._identify_estimation_risks(features)

        return Estimate(
            effort_hours=round(adjusted_effort, 0),
            duration_weeks=round(duration, 1),
            confidence_low=round(adjusted_effort * 0.8, 0),
            confidence_high=round(adjusted_effort * 1.3, 0),
            confidence_level=confidence,
            risk_factors=risks,
            assumptions=self._get_assumptions(features)
        )

    def _extract_features(self, features: ProjectFeatures) -> np.ndarray:
        """Extract numeric features for model."""

        safety_map = {'QM': 0, 'ASIL-A': 1, 'ASIL-B': 2, 'ASIL-C': 3, 'ASIL-D': 4}
        security_map = {'CAL 1': 1, 'CAL 2': 2, 'CAL 3': 3, 'CAL 4': 4}
        experience_map = {'junior': 0.7, 'mixed': 1.0, 'senior': 1.3}
        expertise_map = {'low': 0.8, 'medium': 1.0, 'high': 1.2}

        return np.array([
            features.requirement_count,
            features.function_point_estimate,
            features.lines_of_code_estimate,
            features.interface_count,
            safety_map.get(features.safety_level, 0),
            security_map.get(features.security_level, 1),
            features.reuse_percentage,
            features.team_size,
            experience_map.get(features.team_experience, 1.0),
            expertise_map.get(features.domain_expertise, 1.0),
            1 if features.real_time_constraints else 0,
            1 if features.misra_compliance else 0
        ])

    def _calculate_base_effort(self, features: ProjectFeatures) -> float:
        """Calculate base effort using simplified COCOMO-like model.

        Note: This is a simplified approach; consider using COCOMO II or
        organization-specific calibration for production estimates.
        """

        # Base: 3 hours per function point (industry average - calibrate for your organization)
        base_hours_per_fp = 3.0

        # Adjust for embedded software (typically 1.5x)
        embedded_factor = 1.5

        base_effort = features.function_point_estimate * base_hours_per_fp * embedded_factor

        return base_effort

    def _calculate_adjustments(self, features: ProjectFeatures) -> Dict[str, float]:
        """Calculate adjustment factors."""

        factors = {}

        # Safety factor
        safety_factors = {
            'QM': 1.0, 'ASIL-A': 1.1, 'ASIL-B': 1.25,
            'ASIL-C': 1.5, 'ASIL-D': 1.8
        }
        factors['safety'] = safety_factors.get(features.safety_level, 1.0)

        # Security factor
        security_factors = {
            'CAL 1': 1.0, 'CAL 2': 1.1, 'CAL 3': 1.2, 'CAL 4': 1.35
        }
        factors['security'] = security_factors.get(features.security_level, 1.0)

        # Reuse factor (reduces effort)
        factors['reuse'] = 1.0 - (features.reuse_percentage * 0.5)

        # Team experience factor
        experience_factors = {'junior': 1.3, 'mixed': 1.0, 'senior': 0.85}
        factors['experience'] = experience_factors.get(features.team_experience, 1.0)

        # MISRA compliance factor
        factors['misra'] = 1.15 if features.misra_compliance else 1.0

        # Real-time factor
        factors['realtime'] = 1.2 if features.real_time_constraints else 1.0

        # Total factor
        factors['total_factor'] = (
            factors['safety'] *
            factors['security'] *
            factors['reuse'] *
            factors['experience'] *
            factors['misra'] *
            factors['realtime']
        )

        return factors

    def _calculate_optimal_team(self, effort: float,
                               features: ProjectFeatures) -> int:
        """Calculate optimal team size using Brooks' Law consideration."""

        # Square root rule for team sizing
        optimal = int(np.sqrt(effort / 200))  # ~200 hours per person baseline

        # Constrain to reasonable range
        return max(2, min(optimal, features.team_size))

    def _calculate_confidence(self, features: ProjectFeatures,
                             estimate: float) -> float:
        """Calculate confidence level for estimate."""

        confidence = 0.75  # Base confidence

        # Higher requirements = lower confidence
        if features.requirement_count > 100:
            confidence -= 0.05
        if features.requirement_count > 200:
            confidence -= 0.05

        # Higher safety = lower confidence (more unknowns)
        if features.safety_level in ['ASIL-C', 'ASIL-D']:
            confidence -= 0.05

        # More reuse = higher confidence
        if features.reuse_percentage > 0.3:
            confidence += 0.05

        # Experienced team = higher confidence
        if features.team_experience == 'senior':
            confidence += 0.05

        return min(0.9, max(0.5, confidence))

    def _identify_estimation_risks(self, features: ProjectFeatures) -> List[str]:
        """Identify risks to estimation accuracy."""

        risks = []

        if features.requirement_count > 150:
            risks.append("Large scope increases estimation uncertainty")

        if features.reuse_percentage < 0.1:
            risks.append("Low reuse - most code is new development")

        if features.safety_level in ['ASIL-C', 'ASIL-D']:
            risks.append("High safety level may require additional activities")

        if features.team_experience == 'junior':
            risks.append("Junior team may face learning curve")

        if features.interface_count > 10:
            risks.append("Many interfaces increase integration complexity")

        return risks

    def _get_assumptions(self, features: ProjectFeatures) -> List[str]:
        """Document estimation assumptions."""

        return [
            "Requirements are stable (< 10% change expected)",
            "Team availability at planned capacity",
            "Tools and infrastructure available from project start",
            "No major technology changes during project",
            f"Team size: {features.team_size} engineers"
        ]


def generate_estimate_report(estimate: Estimate, project_name: str) -> str:
    """Generate estimation report."""

    report = [f"# Project Estimate: {project_name}\n"]

    report.append("## Summary\n")
    report.append(f"| Metric | Value |")
    report.append(f"|--------|-------|")
    report.append(f"| Effort | {estimate.effort_hours:,.0f} hours |")
    report.append(f"| Duration | {estimate.duration_weeks:.1f} weeks |")
    report.append(f"| Confidence | {estimate.confidence_level*100:.0f}% |")
    report.append(f"| Range | {estimate.confidence_low:,.0f} - {estimate.confidence_high:,.0f} hours |\n")

    report.append("## Risk Factors\n")
    for risk in estimate.risk_factors:
        report.append(f"- {risk}")

    report.append("\n## Assumptions\n")
    for assumption in estimate.assumptions:
        report.append(f"- {assumption}")

    return "\n".join(report)

Project Planning Framework

Work Breakdown Structure

The following diagram presents an example Work Breakdown Structure for an ASPICE-compliant project, decomposing the project scope into manageable work packages aligned with process groups.

WBS Structure


Progress Tracking Dashboard

AI-Generated Status Report

The diagram below shows an AI-generated project status report, consolidating schedule adherence, risk status, milestone progress, and resource utilization into a single dashboard view.

Project Status Report


Project Plan Template

Note: Resource names and dates are illustrative; customize for actual project.

# Project Plan (template)
project_plan:
  project_id: PRJ-(ID)
  project_name: "(Project Name)"
  version: 1.0
  date: (date)

  overview:
    description: |
      Development of Body Control Module software for door lock
      control function, including remote keyless entry support.
    objectives:
      - "Implement door lock/unlock control per customer specification"
      - "Achieve ASIL-B certification for safety functions"
      - "Meet CAL 3 cybersecurity requirements"
    scope:
      in_scope:
        - "Door lock/unlock control logic"
        - "Remote keyless entry interface"
        - "CAN communication stack"
        - "Diagnostic services"
      out_of_scope:
        - "Hardware design (customer provided)"
        - "Backend connectivity"

  schedule:
    start_date: 2024-10-01
    end_date: 2025-03-01
    duration_weeks: 22

    phases:
      - name: "Requirements"
        start: 2024-10-01
        end: 2024-11-15
        deliverables: [SRS, traceability matrix]

      - name: "Architecture"
        start: 2024-11-01
        end: 2024-12-15
        deliverables: [Architecture document, design review]

      - name: "Implementation"
        start: 2024-12-01
        end: 2025-01-31
        deliverables: [Source code, unit tests]

      - name: "Integration"
        start: 2025-01-15
        end: 2025-02-15
        deliverables: [Integration test report]

      - name: "Qualification"
        start: 2025-02-01
        end: 2025-03-01
        deliverables: [Qualification report, release]

  resources:
    team:
      - role: Project Manager
        allocation: 50%
        name: TBD

      - role: SW Architect
        allocation: 100%
        name: TBD

      - role: SW Developer
        count: 3
        allocation: 100%

      - role: Test Engineer
        count: 2
        allocation: 100%

      - role: Safety Engineer
        allocation: 25%
        name: TBD

    budget:
      labor_hours: 3200
      hardware: 15000
      tools: 5000
      total: 180000

  risks:
    - id: RSK-001
      description: "HIL equipment availability"
      probability: medium
      impact: high
      mitigation: "Reserve equipment early"

    - id: RSK-002
      description: "Requirements changes"
      probability: medium
      impact: medium
      mitigation: "Change control process"

  communication:
    status_meetings: "Weekly on Monday"
    reports: "Bi-weekly to steering committee"
    tools: ["Jira", "Confluence", "Teams"]

  quality:
    reviews:
      - type: Requirements review
        milestone: M1
      - type: Architecture review
        milestone: M2
      - type: Code review
        timing: Continuous

    metrics:
      - name: Requirements coverage
        target: "100%"
      - name: Code coverage
        target: "> 80%"
      - name: Open defects at release
        target: "0 critical, 0 high"

Work Products

WP ID Work Product AI Role
08-04 Project plan Template generation
08-06 Work breakdown structure Decomposition assistance
08-08 Schedule Optimization
08-09 Resource plan Allocation assistance
13-07 Progress report Automated generation
13-08 Meeting minutes Summarization

Summary

MAN.3 Project Management:

  • AI Level: L1-L2 (AI assists, human decides)
  • Primary AI Value: Estimation, tracking, reporting
  • Human Essential: Planning decisions, corrective actions
  • Key Outputs: Project plans, progress reports
  • Integration: Links to all development processes