Replace implemented column with CMMI maturity level

Drop the boolean implemented/not-implemented state in favor of a
mandatory CMMI maturity level enum (NONE, INITIAL, MANAGED, DEFINED,
QUANTITATIVELY_MANAGED, OPTIMIZING) stored as a Postgres enum type.

The migration backfills existing rows (NOT_IMPLEMENTED → NONE,
IMPLEMENTED → INITIAL), makes the column NOT NULL, and drops the old
implemented column and its enum type.

- maturityLevel is required on CreateControlInput and non-nullable (!)
  in the GraphQL schema
- CLI displays human-readable CMMI labels instead of raw enum tokens
- SOA table and published document use a single Maturity column in
  place of the old Implemented + Maturity columns
- Remove ControlImplementationState type and all implemented references
  across backend, frontend, CLI, MCP, n8n, and E2E tests

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
This commit is contained in:
Sacha Al Himdani
2026-04-20 20:48:23 +02:00
parent da91afc2a7
commit e1148f812e
32 changed files with 271 additions and 586 deletions

View File

@@ -370,7 +370,7 @@ type snapshotControl struct {
applicability bool
justification *string
bestPractice bool
implemented string
maturityLevel string
notImplementedJustification *string
hasLegal bool
hasContractual bool
@@ -403,7 +403,7 @@ SELECT
stmt.applicability,
stmt.justification,
c.best_practice,
c.implemented,
c.maturity_level,
c.not_implemented_justification,
EXISTS (
SELECT 1 FROM controls_obligations co
@@ -442,7 +442,7 @@ ORDER BY f.name, c.section_title;
&sc.applicability,
&sc.justification,
&sc.bestPractice,
&sc.implemented,
&sc.maturityLevel,
&sc.notImplementedJustification,
&sc.hasLegal,
&sc.hasContractual,
@@ -458,17 +458,13 @@ ORDER BY f.name, c.section_title;
justification = *sc.justification
}
implemented := "-"
maturityLevel := "-"
if applicable {
if sc.implemented == "IMPLEMENTED" {
implemented = "Yes"
} else {
implemented = "No"
}
maturityLevel = docgen.MaturityLabel(coredata.ControlMaturityLevel(sc.maturityLevel))
}
notImplJustification := "-"
if applicable && sc.implemented != "IMPLEMENTED" && sc.notImplementedJustification != nil {
if applicable && sc.maturityLevel == "NONE" && sc.notImplementedJustification != nil {
notImplJustification = *sc.notImplementedJustification
}
@@ -489,7 +485,7 @@ ORDER BY f.name, c.section_title;
ControlName: sc.controlName,
Applicability: docgen.BoolLabel(applicable),
Justification: justification,
Implemented: implemented,
MaturityLevel: maturityLevel,
NotImplJustification: notImplJustification,
Regulatory: regulatory,
Contractual: contractual,