--- title: Innovation Lifecycle created: 2026-04-08 updated: 2026-04-08 status: evolving tags: [concept, lifecycle, phases, governance] sources: [app/Enums/FaseType.php, app/Enums/ProjectStatus.php, app/Services/ProjectService.php] --- # Innovation Lifecycle Every innovation project at the R&D lab follows a 9-phase lifecycle, from initial signal to final evaluation. The platform enforces this via `FaseType` and `ProjectStatus` enums with transactional phase transitions. ## Phases ``` signaal → verkenning → concept → experiment → pilot → besluitvorming → overdracht_bouwen → overdracht_beheer → evaluatie ``` | # | Phase | Dutch | Purpose | |---|---|---|---| | 1 | Signal | Signaal | Initial idea or observation captured | | 2 | Exploration | Verkenning | Research and feasibility assessment | | 3 | Concept | Concept | Design a proposed solution | | 4 | Experiment | Experiment | Small-scale test of the concept | | 5 | Pilot | Pilot | Larger-scale test in production environment | | 6 | Decision | Besluitvorming | Go/no-go decision by governance | | 7 | Handover to Build | Overdracht bouwen | Transfer to development/implementation team | | 8 | Handover to Operations | Overdracht beheer | Transfer to operational team for maintenance | | 9 | Evaluation | Evaluatie | Post-handover review and lessons learned | ## Special Statuses These are Project-only statuses (not lifecycle phases): | Status | Purpose | |---|---| | Geparkeerd | Temporarily halted — can resume later | | Gestopt | Permanently stopped — documented why | | Afgerond | Successfully completed the full lifecycle | ## Phase Transition Logic Phase transitions go through `ProjectService::transitionPhase()` in a database transaction: 1. Close current active phase (set status → `afgerond`, set `einddatum`) 2. Create new phase record (via `FaseType::tryFrom()` mapping) 3. Update project status 4. Write audit log entry with `from` and `to` states Key constraint: `FaseType::tryFrom($newStatus->value)` — the first 9 ProjectStatus values map 1:1 to FaseType. Special statuses (geparkeerd, gestopt, afgerond) do not create new Fase records. ## Park and Stop - **Park** (`ProjectService::park()`): closes active phase with reason in `opmerkingen`, sets status to `geparkeerd` - **Stop** (`ProjectService::stop()`): same mechanics, sets status to `gestopt` - Both log the transition reason in the audit trail ## Audit Trail Every phase transition, park, or stop creates an `AuditLog` record: ```php AuditLog::create([ 'user_id' => Auth::id(), 'action' => "project.phase_transition", 'entity_type' => 'project', 'entity_id' => $project->id, 'payload' => ['from' => 'signaal', 'to' => 'verkenning'], ]); ``` ## Metro Map Representation - **Level 1**: Project status shown as station dot color (green=completed, cyan=active, yellow=parked, red=stopped) - **Level 2**: Each lifecycle phase is a station on the project's "lifecycle" line, with active phase highlighted