@bicon/mcp-composer 0.3.5 → 0.4.0

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.
Files changed (3) hide show
  1. package/README.md +73 -11
  2. package/dist/index.mjs +1479 -611
  3. package/package.json +9 -3
package/dist/index.mjs CHANGED
@@ -12,7 +12,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
12
12
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
13
13
 
14
14
  // src/version.ts
15
- var COMPOSER_VERSION = true ? "0.3.5" : readPackageVersion();
15
+ var COMPOSER_VERSION = true ? "0.4.0" : readPackageVersion();
16
16
 
17
17
  // ../../../node_modules/.pnpm/zod@3.25.76/node_modules/zod/v3/external.js
18
18
  var external_exports = {};
@@ -4102,31 +4102,96 @@ var UpdateSkillResponse = objectType({
4102
4102
  var DeleteSkillParams = objectType({
4103
4103
  "id": coerce.string().uuid()
4104
4104
  });
4105
+ var listCapabilitiesResponseNameMax = 200;
4106
+ var listCapabilitiesResponseCurrentMaturityMax = 5;
4107
+ var listCapabilitiesResponseTargetMaturityMax = 5;
4108
+ var listCapabilitiesResponseOwnerMax = 200;
4109
+ var ListCapabilitiesResponseItem = objectType({
4110
+ "id": stringType().uuid(),
4111
+ "name": stringType().max(listCapabilitiesResponseNameMax),
4112
+ "parentId": stringType().uuid().nullable(),
4113
+ "currentMaturity": numberType().min(1).max(listCapabilitiesResponseCurrentMaturityMax),
4114
+ "targetMaturity": numberType().min(1).max(listCapabilitiesResponseTargetMaturityMax),
4115
+ "importance": enumType(["differentiating", "core", "supporting"]),
4116
+ "owner": stringType().max(listCapabilitiesResponseOwnerMax).optional(),
4117
+ "sortOrder": numberType()
4118
+ }).describe("One node of the organisation's capability map: a domain (parentId null) or a capability under a domain. Maturity (1\u20135) and importance are meaningful on capabilities; a domain carries the defaults.");
4119
+ var ListCapabilitiesResponse = arrayType(ListCapabilitiesResponseItem);
4120
+ var createCapabilityBodyNameMax = 200;
4121
+ var createCapabilityBodyCurrentMaturityMax = 5;
4122
+ var createCapabilityBodyTargetMaturityMax = 5;
4123
+ var createCapabilityBodyOwnerMax = 200;
4124
+ var CreateCapabilityBody = objectType({
4125
+ "id": stringType().uuid().optional().describe("Optional client-supplied id \u2014 see SkillInput's id field."),
4126
+ "name": stringType().max(createCapabilityBodyNameMax),
4127
+ "parentId": stringType().uuid().nullish().describe("The domain this capability belongs to; null (or absent) for a domain."),
4128
+ "currentMaturity": numberType().min(1).max(createCapabilityBodyCurrentMaturityMax),
4129
+ "targetMaturity": numberType().min(1).max(createCapabilityBodyTargetMaturityMax),
4130
+ "importance": enumType(["differentiating", "core", "supporting"]),
4131
+ "owner": stringType().max(createCapabilityBodyOwnerMax).optional(),
4132
+ "sortOrder": numberType()
4133
+ });
4134
+ var UpdateCapabilityParams = objectType({
4135
+ "id": coerce.string().uuid()
4136
+ });
4137
+ var updateCapabilityBodyNameMax = 200;
4138
+ var updateCapabilityBodyCurrentMaturityMax = 5;
4139
+ var updateCapabilityBodyTargetMaturityMax = 5;
4140
+ var updateCapabilityBodyOwnerMax = 200;
4141
+ var UpdateCapabilityBody = objectType({
4142
+ "id": stringType().uuid().optional().describe("Optional client-supplied id \u2014 see SkillInput's id field."),
4143
+ "name": stringType().max(updateCapabilityBodyNameMax),
4144
+ "parentId": stringType().uuid().nullish().describe("The domain this capability belongs to; null (or absent) for a domain."),
4145
+ "currentMaturity": numberType().min(1).max(updateCapabilityBodyCurrentMaturityMax),
4146
+ "targetMaturity": numberType().min(1).max(updateCapabilityBodyTargetMaturityMax),
4147
+ "importance": enumType(["differentiating", "core", "supporting"]),
4148
+ "owner": stringType().max(updateCapabilityBodyOwnerMax).optional(),
4149
+ "sortOrder": numberType()
4150
+ });
4151
+ var updateCapabilityResponseNameMax = 200;
4152
+ var updateCapabilityResponseCurrentMaturityMax = 5;
4153
+ var updateCapabilityResponseTargetMaturityMax = 5;
4154
+ var updateCapabilityResponseOwnerMax = 200;
4155
+ var UpdateCapabilityResponse = objectType({
4156
+ "id": stringType().uuid(),
4157
+ "name": stringType().max(updateCapabilityResponseNameMax),
4158
+ "parentId": stringType().uuid().nullable(),
4159
+ "currentMaturity": numberType().min(1).max(updateCapabilityResponseCurrentMaturityMax),
4160
+ "targetMaturity": numberType().min(1).max(updateCapabilityResponseTargetMaturityMax),
4161
+ "importance": enumType(["differentiating", "core", "supporting"]),
4162
+ "owner": stringType().max(updateCapabilityResponseOwnerMax).optional(),
4163
+ "sortOrder": numberType()
4164
+ }).describe("One node of the organisation's capability map: a domain (parentId null) or a capability under a domain. Maturity (1\u20135) and importance are meaningful on capabilities; a domain carries the defaults.");
4165
+ var DeleteCapabilityParams = objectType({
4166
+ "id": coerce.string().uuid()
4167
+ });
4105
4168
  var ListOrganizationMembersResponseItem = objectType({
4106
4169
  "userId": stringType().uuid(),
4107
4170
  "email": stringType(),
4108
4171
  "displayName": stringType().nullable(),
4109
4172
  "role": enumType(["admin", "member", "viewer"]),
4110
- "permissions": arrayType(stringType()).describe("App-managed permission overrides on top of the fixed role (free-form strings, not a closed enum). Known keys: manage_skills, manage_ai_act, manage_metadata, manage_stage_gate, manage_economics, manage_decision_log, manage_dependencies, manage_required_skills, manage_scoring, manage_status_report, manage_prioritisation.")
4173
+ "permissions": arrayType(stringType()).describe("App-managed permission overrides on top of the fixed role (free-form strings, not a closed enum). Known keys: manage_skills, manage_ai_act, manage_metadata, manage_stage_gate, manage_economics, manage_decision_log, manage_dependencies, manage_required_skills, manage_scoring, manage_status_report, manage_prioritisation, manage_capabilities, manage_capability_impact.")
4111
4174
  });
4112
4175
  var ListOrganizationMembersResponse = arrayType(ListOrganizationMembersResponseItem);
4113
4176
  var SyncOrganizationMembersResponse = objectType({
4114
- "synced": numberType().describe("Number of Clerk memberships upserted into the local DB.")
4177
+ "synced": numberType().describe("Number of Clerk memberships upserted into the local DB."),
4178
+ "removed": numberType().describe("Number of local memberships deleted because Clerk no longer lists them. Always 0 when the removal pass was skipped by the guards above.")
4115
4179
  });
4116
4180
  var GetMyOrganizationAccessResponse = objectType({
4117
4181
  "userId": stringType().describe(`The caller's own local user id (matches AuthorRef.userId on initiatives), so the client can tell its own changes apart from a teammate's \u2014 e.g. to suppress the "updated by X" collaboration banner when an edit echoing back is the caller's own save.`),
4118
4182
  "role": enumType(["admin", "member", "viewer"]),
4119
- "permissions": arrayType(stringType()).describe("App-managed permission overrides on top of the fixed role (free-form strings, not a closed enum). Known keys: manage_skills, manage_ai_act, manage_metadata, manage_stage_gate, manage_economics, manage_decision_log, manage_dependencies, manage_required_skills, manage_scoring, manage_status_report, manage_prioritisation.")
4183
+ "permissions": arrayType(stringType()).describe("App-managed permission overrides on top of the fixed role (free-form strings, not a closed enum). Known keys: manage_skills, manage_ai_act, manage_metadata, manage_stage_gate, manage_economics, manage_decision_log, manage_dependencies, manage_required_skills, manage_scoring, manage_status_report, manage_prioritisation, manage_capabilities, manage_capability_impact."),
4184
+ "initiativeLimit": numberType().describe("The most initiatives this organisation may hold, archived ones included. Creating one more answers 507 with code initiative_limit_reached, so the client blocks New, Duplicate and Import up front.")
4120
4185
  });
4121
4186
  var UpdateOrganizationMemberPermissionsParams = objectType({
4122
4187
  "userId": coerce.string().uuid()
4123
4188
  });
4124
4189
  var UpdateOrganizationMemberPermissionsBody = objectType({
4125
- "permissions": arrayType(stringType()).describe("App-managed permission overrides on top of the fixed role (free-form strings, not a closed enum). Known keys: manage_skills, manage_ai_act, manage_metadata, manage_stage_gate, manage_economics, manage_decision_log, manage_dependencies, manage_required_skills, manage_scoring, manage_status_report, manage_prioritisation.")
4190
+ "permissions": arrayType(stringType()).describe("App-managed permission overrides on top of the fixed role (free-form strings, not a closed enum). Known keys: manage_skills, manage_ai_act, manage_metadata, manage_stage_gate, manage_economics, manage_decision_log, manage_dependencies, manage_required_skills, manage_scoring, manage_status_report, manage_prioritisation, manage_capabilities, manage_capability_impact.")
4126
4191
  });
4127
4192
  var UpdateOrganizationMemberPermissionsResponse = objectType({
4128
4193
  "userId": stringType().uuid(),
4129
- "permissions": arrayType(stringType()).describe("App-managed permission overrides on top of the fixed role (free-form strings, not a closed enum). Known keys: manage_skills, manage_ai_act, manage_metadata, manage_stage_gate, manage_economics, manage_decision_log, manage_dependencies, manage_required_skills, manage_scoring, manage_status_report, manage_prioritisation.")
4194
+ "permissions": arrayType(stringType()).describe("App-managed permission overrides on top of the fixed role (free-form strings, not a closed enum). Known keys: manage_skills, manage_ai_act, manage_metadata, manage_stage_gate, manage_economics, manage_decision_log, manage_dependencies, manage_required_skills, manage_scoring, manage_status_report, manage_prioritisation, manage_capabilities, manage_capability_impact.")
4130
4195
  });
4131
4196
  var ListPermissionProfilesResponseItem = objectType({
4132
4197
  "id": stringType().uuid(),
@@ -4157,46 +4222,103 @@ var UpdatePermissionProfileResponse = objectType({
4157
4222
  var DeletePermissionProfileParams = objectType({
4158
4223
  "id": coerce.string().uuid()
4159
4224
  });
4225
+ var listUserPortfoliosResponseInitiativeIdsMax = 1e4;
4160
4226
  var ListUserPortfoliosResponseItem = objectType({
4161
4227
  "id": stringType().uuid(),
4162
4228
  "name": stringType(),
4163
- "initiativeIds": arrayType(stringType())
4164
- });
4229
+ "shared": booleanType().describe("When true, everyone in the organisation can see it. Only the owner can ever edit or delete it, shared or not."),
4230
+ "ownedByMe": booleanType().describe("Whether the CALLER owns this portfolio \u2014 the client uses it to hide edit and delete controls it must not offer. The owner's identity is deliberately not exposed; a viewer has no need for it and it would be a second place for authorship to leak."),
4231
+ "initiativeIds": arrayType(stringType()).max(listUserPortfoliosResponseInitiativeIdsMax)
4232
+ }).describe("A saved named subset of initiatives, owned by whoever created it. Private to its owner unless `shared` is set. The list endpoint returns the caller's own portfolios plus the organisation's shared ones; a portfolio whose owner has been erased is returned only if it was shared, so a GDPR erasure cannot publish someone's private views.");
4165
4233
  var ListUserPortfoliosResponse = arrayType(ListUserPortfoliosResponseItem);
4234
+ var createUserPortfolioBodyInitiativeIdsMax = 1e4;
4166
4235
  var CreateUserPortfolioBody = objectType({
4167
4236
  "id": stringType().uuid().optional().describe("Optional client-supplied id \u2014 see SkillInput's id field."),
4168
4237
  "name": stringType(),
4169
- "initiativeIds": arrayType(stringType())
4238
+ "shared": booleanType().optional().describe("Share with the whole organisation. Defaults to false \u2014 a portfolio is private to its creator unless this is set. Ownership itself is never taken from the request body: it comes from the session, and a `createdByUserId` in the payload is ignored."),
4239
+ "initiativeIds": arrayType(stringType().uuid()).max(createUserPortfolioBodyInitiativeIdsMax).describe("Initiatives this saved view contains. Ids that do not resolve to a live initiative in the caller's organisation are dropped on write, and duplicates are collapsed \u2014 so what is stored is always a set of real, in-organisation references. A stale id (its initiative was deleted) and a foreign id (it belongs to another organisation) are treated identically and silently, so a caller cannot use the response to discover that an id exists somewhere else.")
4170
4240
  });
4171
4241
  var UpdateUserPortfolioParams = objectType({
4172
4242
  "id": coerce.string().uuid()
4173
4243
  });
4244
+ var updateUserPortfolioBodyInitiativeIdsMax = 1e4;
4174
4245
  var UpdateUserPortfolioBody = objectType({
4175
4246
  "id": stringType().uuid().optional().describe("Optional client-supplied id \u2014 see SkillInput's id field."),
4176
4247
  "name": stringType(),
4177
- "initiativeIds": arrayType(stringType())
4248
+ "shared": booleanType().optional().describe("Share with the whole organisation. Defaults to false \u2014 a portfolio is private to its creator unless this is set. Ownership itself is never taken from the request body: it comes from the session, and a `createdByUserId` in the payload is ignored."),
4249
+ "initiativeIds": arrayType(stringType().uuid()).max(updateUserPortfolioBodyInitiativeIdsMax).describe("Initiatives this saved view contains. Ids that do not resolve to a live initiative in the caller's organisation are dropped on write, and duplicates are collapsed \u2014 so what is stored is always a set of real, in-organisation references. A stale id (its initiative was deleted) and a foreign id (it belongs to another organisation) are treated identically and silently, so a caller cannot use the response to discover that an id exists somewhere else.")
4178
4250
  });
4251
+ var updateUserPortfolioResponseInitiativeIdsMax = 1e4;
4179
4252
  var UpdateUserPortfolioResponse = objectType({
4180
4253
  "id": stringType().uuid(),
4181
4254
  "name": stringType(),
4182
- "initiativeIds": arrayType(stringType())
4183
- });
4255
+ "shared": booleanType().describe("When true, everyone in the organisation can see it. Only the owner can ever edit or delete it, shared or not."),
4256
+ "ownedByMe": booleanType().describe("Whether the CALLER owns this portfolio \u2014 the client uses it to hide edit and delete controls it must not offer. The owner's identity is deliberately not exposed; a viewer has no need for it and it would be a second place for authorship to leak."),
4257
+ "initiativeIds": arrayType(stringType()).max(updateUserPortfolioResponseInitiativeIdsMax)
4258
+ }).describe("A saved named subset of initiatives, owned by whoever created it. Private to its owner unless `shared` is set. The list endpoint returns the caller's own portfolios plus the organisation's shared ones; a portfolio whose owner has been erased is returned only if it was shared, so a GDPR erasure cannot publish someone's private views.");
4184
4259
  var DeleteUserPortfolioParams = objectType({
4185
4260
  "id": coerce.string().uuid()
4186
4261
  });
4262
+ var listSnapshotsResponseBusinessUnitsMax = 1e3;
4263
+ var listSnapshotsResponseInitiativesItemNameMax = 200;
4264
+ var listSnapshotsResponseInitiativesItemExternalIdMax = 200;
4265
+ var listSnapshotsResponseInitiativesItemBusinessUnitMax = 200;
4266
+ var listSnapshotsResponseInitiativesItemOwnerMax = 200;
4267
+ var listSnapshotsResponseInitiativesItemDescriptionMax = 1e4;
4268
+ var listSnapshotsResponseInitiativesItemAiCategoryMax = 200;
4269
+ var listSnapshotsResponseInitiativesItemTagsItemMax = 200;
4270
+ var listSnapshotsResponseInitiativesItemTagsMax = 1e3;
4271
+ var listSnapshotsResponseInitiativesItemDocsUrlMax = 2e3;
4272
+ var listSnapshotsResponseInitiativesItemPmUrlMax = 2e3;
4273
+ var listSnapshotsResponseInitiativesItemDecisionLogItemOwnerMax = 200;
4274
+ var listSnapshotsResponseInitiativesItemDecisionLogItemRationaleMax = 1e4;
4275
+ var listSnapshotsResponseInitiativesItemDecisionLogMax = 1e3;
4276
+ var listSnapshotsResponseInitiativesItemStatusReportsItemAuthorMax = 200;
4277
+ var listSnapshotsResponseInitiativesItemStatusReportsItemScopeCommentMax = 1e4;
4278
+ var listSnapshotsResponseInitiativesItemStatusReportsItemTimelineCommentMax = 1e4;
4279
+ var listSnapshotsResponseInitiativesItemStatusReportsItemBudgetCommentMax = 1e4;
4280
+ var listSnapshotsResponseInitiativesItemStatusReportsItemSkillsCommentMax = 1e4;
4281
+ var listSnapshotsResponseInitiativesItemStatusReportsItemSummaryMax = 1e4;
4282
+ var listSnapshotsResponseInitiativesItemStatusReportsMax = 1e3;
4283
+ var listSnapshotsResponseInitiativesItemDependsOnMax = 1e3;
4284
+ var listSnapshotsResponseInitiativesItemRequiredSkillsItemRunFteMin = 0;
4285
+ var listSnapshotsResponseInitiativesItemRequiredSkillsMax = 1e3;
4286
+ var listSnapshotsResponseInitiativesItemCapabilityImpactsItemMaturityToMax = 5;
4287
+ var listSnapshotsResponseInitiativesItemCapabilityImpactsMax = 1e3;
4288
+ var listSnapshotsResponseInitiativesItemDpiaUrlMax = 2e3;
4289
+ var listSnapshotsResponseInitiativesItemModelCardUrlMax = 2e3;
4290
+ var listSnapshotsResponseInitiativesItemProhibitedOverrideMax = 2e3;
4291
+ var listSnapshotsResponseInitiativesItemGateEvidenceNoteMax = 1e4;
4292
+ var listSnapshotsResponseInitiativesItemAiActProhibitedPracticesItemMax = 200;
4293
+ var listSnapshotsResponseInitiativesItemAiActProhibitedPracticesMax = 100;
4294
+ var listSnapshotsResponseInitiativesItemAiActArt50FlagsItemMax = 200;
4295
+ var listSnapshotsResponseInitiativesItemAiActArt50FlagsMax = 100;
4296
+ var listSnapshotsResponseInitiativesItemAiActClassificationRationaleMax = 1e4;
4297
+ var listSnapshotsResponseInitiativesItemAiActArtifactsOwnerMax = 200;
4298
+ var listSnapshotsResponseInitiativesItemAiActArtifactsLinkMax = 2e3;
4299
+ var listSnapshotsResponseInitiativesItemAiActArtifactsNoteMax = 1e4;
4300
+ var listSnapshotsResponseInitiativesItemAiActObligationsOwnerMax = 200;
4301
+ var listSnapshotsResponseInitiativesItemAiActObligationsEvidenceLinkMax = 2e3;
4302
+ var listSnapshotsResponseInitiativesItemAiActObligationsApproverMax = 200;
4303
+ var listSnapshotsResponseInitiativesItemAiActIncidentsItemDescriptionMax = 1e4;
4304
+ var listSnapshotsResponseInitiativesItemAiActIncidentsItemAuthorityRefMax = 2e3;
4305
+ var listSnapshotsResponseInitiativesItemAiActIncidentsItemOwnerMax = 200;
4306
+ var listSnapshotsResponseInitiativesItemAiActIncidentsItemRootCauseMax = 1e4;
4307
+ var listSnapshotsResponseInitiativesItemAiActIncidentsItemCorrectiveActionsMax = 1e4;
4308
+ var listSnapshotsResponseInitiativesItemAiActIncidentsMax = 1e3;
4187
4309
  var ListSnapshotsResponseItem = objectType({
4188
4310
  "id": stringType().uuid(),
4189
4311
  "label": stringType(),
4190
4312
  "notes": stringType(),
4191
4313
  "currency": stringType(),
4192
- "businessUnits": arrayType(stringType()),
4314
+ "businessUnits": arrayType(stringType()).max(listSnapshotsResponseBusinessUnitsMax),
4193
4315
  "initiatives": arrayType(objectType({
4194
4316
  "id": stringType(),
4195
- "name": stringType(),
4196
- "externalId": stringType().optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
4197
- "businessUnit": stringType(),
4198
- "owner": stringType(),
4199
- "description": stringType(),
4317
+ "name": stringType().max(listSnapshotsResponseInitiativesItemNameMax),
4318
+ "externalId": stringType().max(listSnapshotsResponseInitiativesItemExternalIdMax).optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
4319
+ "businessUnit": stringType().max(listSnapshotsResponseInitiativesItemBusinessUnitMax),
4320
+ "owner": stringType().max(listSnapshotsResponseInitiativesItemOwnerMax),
4321
+ "description": stringType().max(listSnapshotsResponseInitiativesItemDescriptionMax),
4200
4322
  "status": enumType(["Idea", "Pilot", "Scaling", "In Production", "On Hold", "Retired"]),
4201
4323
  "timelineStart": stringType(),
4202
4324
  "timelineEnd": stringType(),
@@ -4204,15 +4326,20 @@ var ListSnapshotsResponseItem = objectType({
4204
4326
  "budgetForwardLooking": numberType().optional(),
4205
4327
  "vendorDependency": enumType(["None", "Single Vendor", "Multi-Vendor", "Internal Build", "Hybrid"]),
4206
4328
  "solutionType": enumType(["Internal", "External", "Hybrid"]),
4207
- "aiCategory": stringType(),
4208
- "tags": arrayType(stringType()),
4209
- "docsUrl": stringType().optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
4210
- "pmUrl": stringType().optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
4329
+ "aiCategory": stringType().max(listSnapshotsResponseInitiativesItemAiCategoryMax),
4330
+ "tags": arrayType(stringType().max(listSnapshotsResponseInitiativesItemTagsItemMax)).max(listSnapshotsResponseInitiativesItemTagsMax),
4331
+ "docsUrl": stringType().max(listSnapshotsResponseInitiativesItemDocsUrlMax).optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
4332
+ "pmUrl": stringType().max(listSnapshotsResponseInitiativesItemPmUrlMax).optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
4211
4333
  "archived": booleanType(),
4212
4334
  "evaluation": objectType({
4213
4335
  "valueScale": objectType({
4214
4336
  "score": numberType(),
4215
- "confidence": enumType(["Low", "Medium", "High"])
4337
+ "confidence": enumType(["Low", "Medium", "High"]),
4338
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
4339
+ "scoredBy": objectType({
4340
+ "userId": stringType().uuid(),
4341
+ "name": stringType()
4342
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4216
4343
  }).and(objectType({
4217
4344
  "subs": objectType({
4218
4345
  "frequencyOfProcess": numberType(),
@@ -4226,7 +4353,12 @@ var ListSnapshotsResponseItem = objectType({
4226
4353
  })),
4227
4354
  "feasibility": objectType({
4228
4355
  "score": numberType(),
4229
- "confidence": enumType(["Low", "Medium", "High"])
4356
+ "confidence": enumType(["Low", "Medium", "High"]),
4357
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
4358
+ "scoredBy": objectType({
4359
+ "userId": stringType().uuid(),
4360
+ "name": stringType()
4361
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4230
4362
  }).and(objectType({
4231
4363
  "subs": objectType({
4232
4364
  "dataAvailability": numberType(),
@@ -4240,7 +4372,12 @@ var ListSnapshotsResponseItem = objectType({
4240
4372
  })),
4241
4373
  "governance": objectType({
4242
4374
  "score": numberType(),
4243
- "confidence": enumType(["Low", "Medium", "High"])
4375
+ "confidence": enumType(["Low", "Medium", "High"]),
4376
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
4377
+ "scoredBy": objectType({
4378
+ "userId": stringType().uuid(),
4379
+ "name": stringType()
4380
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4244
4381
  }).and(objectType({
4245
4382
  "subs": objectType({
4246
4383
  "regulatoryExposure": numberType(),
@@ -4255,7 +4392,12 @@ var ListSnapshotsResponseItem = objectType({
4255
4392
  })),
4256
4393
  "strategic": objectType({
4257
4394
  "score": numberType(),
4258
- "confidence": enumType(["Low", "Medium", "High"])
4395
+ "confidence": enumType(["Low", "Medium", "High"]),
4396
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
4397
+ "scoredBy": objectType({
4398
+ "userId": stringType().uuid(),
4399
+ "name": stringType()
4400
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4259
4401
  }).and(objectType({
4260
4402
  "subs": objectType({
4261
4403
  "strategicDifferentiation": numberType(),
@@ -4287,7 +4429,8 @@ var ListSnapshotsResponseItem = objectType({
4287
4429
  "y1Pct": numberType(),
4288
4430
  "y2Pct": numberType()
4289
4431
  }).optional(),
4290
- "discountRatePct": numberType().optional()
4432
+ "discountRatePct": numberType().optional(),
4433
+ "operatingCostAnnual": numberType().optional()
4291
4434
  }).optional(),
4292
4435
  "actuals": objectType({
4293
4436
  "operatingCostAnnual": numberType().optional(),
@@ -4307,48 +4450,64 @@ var ListSnapshotsResponseItem = objectType({
4307
4450
  "id": stringType(),
4308
4451
  "date": stringType(),
4309
4452
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
4310
- "owner": stringType().optional(),
4311
- "rationale": stringType().optional(),
4312
- "createdAt": stringType().optional()
4313
- })).optional(),
4453
+ "owner": stringType().max(listSnapshotsResponseInitiativesItemDecisionLogItemOwnerMax).optional(),
4454
+ "rationale": stringType().max(listSnapshotsResponseInitiativesItemDecisionLogItemRationaleMax).optional(),
4455
+ "createdAt": stringType().optional(),
4456
+ "recordedAt": stringType().optional().describe("Server stamp: when the entry was recorded or its content last changed (`date` is when the decision was taken). Absent on entries not saved since the stamps were introduced. Ignored in requests."),
4457
+ "recordedBy": objectType({
4458
+ "userId": stringType().uuid(),
4459
+ "name": stringType()
4460
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who recorded it. Ignored in requests.")
4461
+ })).max(listSnapshotsResponseInitiativesItemDecisionLogMax).optional(),
4314
4462
  "statusReports": arrayType(objectType({
4315
4463
  "id": stringType(),
4316
4464
  "date": stringType(),
4317
- "author": stringType().optional(),
4465
+ "author": stringType().max(listSnapshotsResponseInitiativesItemStatusReportsItemAuthorMax).optional(),
4318
4466
  "scope": objectType({
4319
4467
  "rag": enumType(["green", "yellow", "red"]),
4320
- "comment": stringType().optional()
4468
+ "comment": stringType().max(listSnapshotsResponseInitiativesItemStatusReportsItemScopeCommentMax).optional()
4321
4469
  }),
4322
4470
  "timeline": objectType({
4323
4471
  "rag": enumType(["green", "yellow", "red"]),
4324
- "comment": stringType().optional()
4472
+ "comment": stringType().max(listSnapshotsResponseInitiativesItemStatusReportsItemTimelineCommentMax).optional()
4325
4473
  }),
4326
4474
  "budget": objectType({
4327
4475
  "rag": enumType(["green", "yellow", "red"]),
4328
- "comment": stringType().optional()
4476
+ "comment": stringType().max(listSnapshotsResponseInitiativesItemStatusReportsItemBudgetCommentMax).optional()
4329
4477
  }),
4330
4478
  "skills": objectType({
4331
4479
  "rag": enumType(["green", "yellow", "red"]),
4332
- "comment": stringType().optional()
4480
+ "comment": stringType().max(listSnapshotsResponseInitiativesItemStatusReportsItemSkillsCommentMax).optional()
4333
4481
  }),
4334
- "summary": stringType().optional()
4335
- })).optional(),
4336
- "dependsOn": arrayType(stringType()),
4482
+ "summary": stringType().max(listSnapshotsResponseInitiativesItemStatusReportsItemSummaryMax).optional()
4483
+ })).max(listSnapshotsResponseInitiativesItemStatusReportsMax).optional(),
4484
+ "dependsOn": arrayType(stringType()).max(listSnapshotsResponseInitiativesItemDependsOnMax),
4337
4485
  "requiredSkills": arrayType(objectType({
4338
4486
  "skillId": stringType(),
4339
- "fte": numberType()
4340
- })).optional(),
4487
+ "fte": numberType(),
4488
+ "runFte": numberType().min(listSnapshotsResponseInitiativesItemRequiredSkillsItemRunFteMin).optional()
4489
+ })).max(listSnapshotsResponseInitiativesItemRequiredSkillsMax).optional(),
4490
+ "capabilityImpacts": arrayType(objectType({
4491
+ "capabilityId": stringType(),
4492
+ "kind": enumType(["improve", "new", "replace", "retire"]),
4493
+ "maturityTo": numberType().min(1).max(listSnapshotsResponseInitiativesItemCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
4494
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(listSnapshotsResponseInitiativesItemCapabilityImpactsMax).optional(),
4341
4495
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
4342
4496
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
4343
4497
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
4344
- "dpiaUrl": stringType().optional(),
4498
+ "dpiaUrl": stringType().max(listSnapshotsResponseInitiativesItemDpiaUrlMax).optional(),
4345
4499
  "modelCardStatus": enumType(["Not Required", "Draft", "Published"]).optional(),
4346
- "modelCardUrl": stringType().optional(),
4347
- "prohibitedOverride": stringType().optional(),
4500
+ "modelCardUrl": stringType().max(listSnapshotsResponseInitiativesItemModelCardUrlMax).optional(),
4501
+ "prohibitedOverride": stringType().max(listSnapshotsResponseInitiativesItemProhibitedOverrideMax).optional(),
4348
4502
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
4349
4503
  "checked": booleanType(),
4350
4504
  "asOfDate": stringType().optional(),
4351
- "note": stringType().optional()
4505
+ "note": stringType().max(listSnapshotsResponseInitiativesItemGateEvidenceNoteMax).optional(),
4506
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
4507
+ "checkedBy": objectType({
4508
+ "userId": stringType().uuid(),
4509
+ "name": stringType()
4510
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who ticked it. Ignored in requests.")
4352
4511
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
4353
4512
  "gateBypassed": booleanType().optional(),
4354
4513
  "aiAct": objectType({
@@ -4364,28 +4523,28 @@ var ListSnapshotsResponseItem = objectType({
4364
4523
  "integratesThirdPartyGpai": booleanType().optional(),
4365
4524
  "upstreamGpaiProvider": stringType().optional(),
4366
4525
  "upstreamGpaiInfoAvailable": booleanType().optional(),
4367
- "prohibitedPractices": arrayType(stringType()),
4368
- "art50Flags": arrayType(stringType()),
4526
+ "prohibitedPractices": arrayType(stringType().max(listSnapshotsResponseInitiativesItemAiActProhibitedPracticesItemMax)).max(listSnapshotsResponseInitiativesItemAiActProhibitedPracticesMax),
4527
+ "art50Flags": arrayType(stringType().max(listSnapshotsResponseInitiativesItemAiActArt50FlagsItemMax)).max(listSnapshotsResponseInitiativesItemAiActArt50FlagsMax),
4369
4528
  "publicSector": booleanType().optional(),
4370
4529
  "establishedOutsideEU": booleanType().optional(),
4371
- "classificationRationale": stringType().optional(),
4530
+ "classificationRationale": stringType().max(listSnapshotsResponseInitiativesItemAiActClassificationRationaleMax).optional(),
4372
4531
  "classificationConfirmed": booleanType().optional(),
4373
4532
  "classificationConfirmedBy": stringType().optional(),
4374
4533
  "classificationConfirmedAt": stringType().optional(),
4375
4534
  "artifacts": recordType(stringType(), objectType({
4376
4535
  "status": enumType(["Not started", "Draft", "In Review", "Approved", "Outdated"]),
4377
- "owner": stringType().optional(),
4536
+ "owner": stringType().max(listSnapshotsResponseInitiativesItemAiActArtifactsOwnerMax).optional(),
4378
4537
  "lastReviewedAt": stringType().optional(),
4379
- "link": stringType().optional(),
4380
- "note": stringType().optional(),
4538
+ "link": stringType().max(listSnapshotsResponseInitiativesItemAiActArtifactsLinkMax).optional(),
4539
+ "note": stringType().max(listSnapshotsResponseInitiativesItemAiActArtifactsNoteMax).optional(),
4381
4540
  "maxAgeDays": numberType().optional()
4382
4541
  })).optional(),
4383
4542
  "obligations": recordType(stringType(), objectType({
4384
4543
  "status": enumType(["Not started", "In Progress", "Done", "N/A"]),
4385
- "owner": stringType().optional(),
4544
+ "owner": stringType().max(listSnapshotsResponseInitiativesItemAiActObligationsOwnerMax).optional(),
4386
4545
  "dueDate": stringType().optional(),
4387
- "evidenceLink": stringType().optional(),
4388
- "approver": stringType().optional(),
4546
+ "evidenceLink": stringType().max(listSnapshotsResponseInitiativesItemAiActObligationsEvidenceLinkMax).optional(),
4547
+ "approver": stringType().max(listSnapshotsResponseInitiativesItemAiActObligationsApproverMax).optional(),
4389
4548
  "approvalDate": stringType().optional(),
4390
4549
  "reviewDate": stringType().optional()
4391
4550
  })).optional(),
@@ -4412,16 +4571,16 @@ var ListSnapshotsResponseItem = objectType({
4412
4571
  "occurredAt": stringType(),
4413
4572
  "detectedAt": stringType(),
4414
4573
  "category": enumType(["general", "death-or-serious-damage", "cybersecurity", "fundamental-rights", "infrastructure-disruption"]),
4415
- "description": stringType(),
4574
+ "description": stringType().max(listSnapshotsResponseInitiativesItemAiActIncidentsItemDescriptionMax),
4416
4575
  "status": enumType(["open", "reported", "closed"]),
4417
- "authorityRef": stringType().optional(),
4418
- "owner": stringType().optional(),
4419
- "rootCause": stringType().optional(),
4420
- "correctiveActions": stringType().optional(),
4576
+ "authorityRef": stringType().max(listSnapshotsResponseInitiativesItemAiActIncidentsItemAuthorityRefMax).optional(),
4577
+ "owner": stringType().max(listSnapshotsResponseInitiativesItemAiActIncidentsItemOwnerMax).optional(),
4578
+ "rootCause": stringType().max(listSnapshotsResponseInitiativesItemAiActIncidentsItemRootCauseMax).optional(),
4579
+ "correctiveActions": stringType().max(listSnapshotsResponseInitiativesItemAiActIncidentsItemCorrectiveActionsMax).optional(),
4421
4580
  "reportedAt": stringType().optional(),
4422
4581
  "createdAt": stringType(),
4423
4582
  "updatedAt": stringType()
4424
- })).optional()
4583
+ })).max(listSnapshotsResponseInitiativesItemAiActIncidentsMax).optional()
4425
4584
  }).optional(),
4426
4585
  "createdBy": objectType({
4427
4586
  "userId": stringType().uuid(),
@@ -4431,25 +4590,73 @@ var ListSnapshotsResponseItem = objectType({
4431
4590
  "userId": stringType().uuid(),
4432
4591
  "name": stringType()
4433
4592
  }).optional().describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body."),
4593
+ "version": numberType().min(1).optional().describe("Save counter, raised by the server on every save. A request names the version its edit is based on in InitiativeInput.baseVersion; this field is ignored in requests."),
4434
4594
  "createdAt": stringType(),
4435
4595
  "updatedAt": stringType()
4436
4596
  })),
4437
4597
  "createdAt": stringType()
4438
4598
  });
4439
4599
  var ListSnapshotsResponse = arrayType(ListSnapshotsResponseItem);
4600
+ var createSnapshotBodyBusinessUnitsMax = 1e3;
4601
+ var createSnapshotBodyInitiativesItemNameMax = 200;
4602
+ var createSnapshotBodyInitiativesItemExternalIdMax = 200;
4603
+ var createSnapshotBodyInitiativesItemBusinessUnitMax = 200;
4604
+ var createSnapshotBodyInitiativesItemOwnerMax = 200;
4605
+ var createSnapshotBodyInitiativesItemDescriptionMax = 1e4;
4606
+ var createSnapshotBodyInitiativesItemAiCategoryMax = 200;
4607
+ var createSnapshotBodyInitiativesItemTagsItemMax = 200;
4608
+ var createSnapshotBodyInitiativesItemTagsMax = 1e3;
4609
+ var createSnapshotBodyInitiativesItemDocsUrlMax = 2e3;
4610
+ var createSnapshotBodyInitiativesItemPmUrlMax = 2e3;
4611
+ var createSnapshotBodyInitiativesItemDecisionLogItemOwnerMax = 200;
4612
+ var createSnapshotBodyInitiativesItemDecisionLogItemRationaleMax = 1e4;
4613
+ var createSnapshotBodyInitiativesItemDecisionLogMax = 1e3;
4614
+ var createSnapshotBodyInitiativesItemStatusReportsItemAuthorMax = 200;
4615
+ var createSnapshotBodyInitiativesItemStatusReportsItemScopeCommentMax = 1e4;
4616
+ var createSnapshotBodyInitiativesItemStatusReportsItemTimelineCommentMax = 1e4;
4617
+ var createSnapshotBodyInitiativesItemStatusReportsItemBudgetCommentMax = 1e4;
4618
+ var createSnapshotBodyInitiativesItemStatusReportsItemSkillsCommentMax = 1e4;
4619
+ var createSnapshotBodyInitiativesItemStatusReportsItemSummaryMax = 1e4;
4620
+ var createSnapshotBodyInitiativesItemStatusReportsMax = 1e3;
4621
+ var createSnapshotBodyInitiativesItemDependsOnMax = 1e3;
4622
+ var createSnapshotBodyInitiativesItemRequiredSkillsItemRunFteMin = 0;
4623
+ var createSnapshotBodyInitiativesItemRequiredSkillsMax = 1e3;
4624
+ var createSnapshotBodyInitiativesItemCapabilityImpactsItemMaturityToMax = 5;
4625
+ var createSnapshotBodyInitiativesItemCapabilityImpactsMax = 1e3;
4626
+ var createSnapshotBodyInitiativesItemDpiaUrlMax = 2e3;
4627
+ var createSnapshotBodyInitiativesItemModelCardUrlMax = 2e3;
4628
+ var createSnapshotBodyInitiativesItemProhibitedOverrideMax = 2e3;
4629
+ var createSnapshotBodyInitiativesItemGateEvidenceNoteMax = 1e4;
4630
+ var createSnapshotBodyInitiativesItemAiActProhibitedPracticesItemMax = 200;
4631
+ var createSnapshotBodyInitiativesItemAiActProhibitedPracticesMax = 100;
4632
+ var createSnapshotBodyInitiativesItemAiActArt50FlagsItemMax = 200;
4633
+ var createSnapshotBodyInitiativesItemAiActArt50FlagsMax = 100;
4634
+ var createSnapshotBodyInitiativesItemAiActClassificationRationaleMax = 1e4;
4635
+ var createSnapshotBodyInitiativesItemAiActArtifactsOwnerMax = 200;
4636
+ var createSnapshotBodyInitiativesItemAiActArtifactsLinkMax = 2e3;
4637
+ var createSnapshotBodyInitiativesItemAiActArtifactsNoteMax = 1e4;
4638
+ var createSnapshotBodyInitiativesItemAiActObligationsOwnerMax = 200;
4639
+ var createSnapshotBodyInitiativesItemAiActObligationsEvidenceLinkMax = 2e3;
4640
+ var createSnapshotBodyInitiativesItemAiActObligationsApproverMax = 200;
4641
+ var createSnapshotBodyInitiativesItemAiActIncidentsItemDescriptionMax = 1e4;
4642
+ var createSnapshotBodyInitiativesItemAiActIncidentsItemAuthorityRefMax = 2e3;
4643
+ var createSnapshotBodyInitiativesItemAiActIncidentsItemOwnerMax = 200;
4644
+ var createSnapshotBodyInitiativesItemAiActIncidentsItemRootCauseMax = 1e4;
4645
+ var createSnapshotBodyInitiativesItemAiActIncidentsItemCorrectiveActionsMax = 1e4;
4646
+ var createSnapshotBodyInitiativesItemAiActIncidentsMax = 1e3;
4440
4647
  var CreateSnapshotBody = objectType({
4441
4648
  "id": stringType().uuid().optional().describe("Optional client-generated id, persisted as the row's primary key (parity with skills/initiatives/portfolios). Without it the client's local snapshot id and the server row diverge, so sync deletes and the poll merge cannot line up by id."),
4442
4649
  "label": stringType(),
4443
4650
  "notes": stringType(),
4444
4651
  "currency": stringType(),
4445
- "businessUnits": arrayType(stringType()),
4652
+ "businessUnits": arrayType(stringType()).max(createSnapshotBodyBusinessUnitsMax),
4446
4653
  "initiatives": arrayType(objectType({
4447
4654
  "id": stringType(),
4448
- "name": stringType(),
4449
- "externalId": stringType().optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
4450
- "businessUnit": stringType(),
4451
- "owner": stringType(),
4452
- "description": stringType(),
4655
+ "name": stringType().max(createSnapshotBodyInitiativesItemNameMax),
4656
+ "externalId": stringType().max(createSnapshotBodyInitiativesItemExternalIdMax).optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
4657
+ "businessUnit": stringType().max(createSnapshotBodyInitiativesItemBusinessUnitMax),
4658
+ "owner": stringType().max(createSnapshotBodyInitiativesItemOwnerMax),
4659
+ "description": stringType().max(createSnapshotBodyInitiativesItemDescriptionMax),
4453
4660
  "status": enumType(["Idea", "Pilot", "Scaling", "In Production", "On Hold", "Retired"]),
4454
4661
  "timelineStart": stringType(),
4455
4662
  "timelineEnd": stringType(),
@@ -4457,15 +4664,20 @@ var CreateSnapshotBody = objectType({
4457
4664
  "budgetForwardLooking": numberType().optional(),
4458
4665
  "vendorDependency": enumType(["None", "Single Vendor", "Multi-Vendor", "Internal Build", "Hybrid"]),
4459
4666
  "solutionType": enumType(["Internal", "External", "Hybrid"]),
4460
- "aiCategory": stringType(),
4461
- "tags": arrayType(stringType()),
4462
- "docsUrl": stringType().optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
4463
- "pmUrl": stringType().optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
4667
+ "aiCategory": stringType().max(createSnapshotBodyInitiativesItemAiCategoryMax),
4668
+ "tags": arrayType(stringType().max(createSnapshotBodyInitiativesItemTagsItemMax)).max(createSnapshotBodyInitiativesItemTagsMax),
4669
+ "docsUrl": stringType().max(createSnapshotBodyInitiativesItemDocsUrlMax).optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
4670
+ "pmUrl": stringType().max(createSnapshotBodyInitiativesItemPmUrlMax).optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
4464
4671
  "archived": booleanType(),
4465
4672
  "evaluation": objectType({
4466
4673
  "valueScale": objectType({
4467
4674
  "score": numberType(),
4468
- "confidence": enumType(["Low", "Medium", "High"])
4675
+ "confidence": enumType(["Low", "Medium", "High"]),
4676
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
4677
+ "scoredBy": objectType({
4678
+ "userId": stringType().uuid(),
4679
+ "name": stringType()
4680
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4469
4681
  }).and(objectType({
4470
4682
  "subs": objectType({
4471
4683
  "frequencyOfProcess": numberType(),
@@ -4479,7 +4691,12 @@ var CreateSnapshotBody = objectType({
4479
4691
  })),
4480
4692
  "feasibility": objectType({
4481
4693
  "score": numberType(),
4482
- "confidence": enumType(["Low", "Medium", "High"])
4694
+ "confidence": enumType(["Low", "Medium", "High"]),
4695
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
4696
+ "scoredBy": objectType({
4697
+ "userId": stringType().uuid(),
4698
+ "name": stringType()
4699
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4483
4700
  }).and(objectType({
4484
4701
  "subs": objectType({
4485
4702
  "dataAvailability": numberType(),
@@ -4493,7 +4710,12 @@ var CreateSnapshotBody = objectType({
4493
4710
  })),
4494
4711
  "governance": objectType({
4495
4712
  "score": numberType(),
4496
- "confidence": enumType(["Low", "Medium", "High"])
4713
+ "confidence": enumType(["Low", "Medium", "High"]),
4714
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
4715
+ "scoredBy": objectType({
4716
+ "userId": stringType().uuid(),
4717
+ "name": stringType()
4718
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4497
4719
  }).and(objectType({
4498
4720
  "subs": objectType({
4499
4721
  "regulatoryExposure": numberType(),
@@ -4508,7 +4730,12 @@ var CreateSnapshotBody = objectType({
4508
4730
  })),
4509
4731
  "strategic": objectType({
4510
4732
  "score": numberType(),
4511
- "confidence": enumType(["Low", "Medium", "High"])
4733
+ "confidence": enumType(["Low", "Medium", "High"]),
4734
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
4735
+ "scoredBy": objectType({
4736
+ "userId": stringType().uuid(),
4737
+ "name": stringType()
4738
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4512
4739
  }).and(objectType({
4513
4740
  "subs": objectType({
4514
4741
  "strategicDifferentiation": numberType(),
@@ -4540,7 +4767,8 @@ var CreateSnapshotBody = objectType({
4540
4767
  "y1Pct": numberType(),
4541
4768
  "y2Pct": numberType()
4542
4769
  }).optional(),
4543
- "discountRatePct": numberType().optional()
4770
+ "discountRatePct": numberType().optional(),
4771
+ "operatingCostAnnual": numberType().optional()
4544
4772
  }).optional(),
4545
4773
  "actuals": objectType({
4546
4774
  "operatingCostAnnual": numberType().optional(),
@@ -4560,48 +4788,64 @@ var CreateSnapshotBody = objectType({
4560
4788
  "id": stringType(),
4561
4789
  "date": stringType(),
4562
4790
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
4563
- "owner": stringType().optional(),
4564
- "rationale": stringType().optional(),
4565
- "createdAt": stringType().optional()
4566
- })).optional(),
4791
+ "owner": stringType().max(createSnapshotBodyInitiativesItemDecisionLogItemOwnerMax).optional(),
4792
+ "rationale": stringType().max(createSnapshotBodyInitiativesItemDecisionLogItemRationaleMax).optional(),
4793
+ "createdAt": stringType().optional(),
4794
+ "recordedAt": stringType().optional().describe("Server stamp: when the entry was recorded or its content last changed (`date` is when the decision was taken). Absent on entries not saved since the stamps were introduced. Ignored in requests."),
4795
+ "recordedBy": objectType({
4796
+ "userId": stringType().uuid(),
4797
+ "name": stringType()
4798
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who recorded it. Ignored in requests.")
4799
+ })).max(createSnapshotBodyInitiativesItemDecisionLogMax).optional(),
4567
4800
  "statusReports": arrayType(objectType({
4568
4801
  "id": stringType(),
4569
4802
  "date": stringType(),
4570
- "author": stringType().optional(),
4803
+ "author": stringType().max(createSnapshotBodyInitiativesItemStatusReportsItemAuthorMax).optional(),
4571
4804
  "scope": objectType({
4572
4805
  "rag": enumType(["green", "yellow", "red"]),
4573
- "comment": stringType().optional()
4806
+ "comment": stringType().max(createSnapshotBodyInitiativesItemStatusReportsItemScopeCommentMax).optional()
4574
4807
  }),
4575
4808
  "timeline": objectType({
4576
4809
  "rag": enumType(["green", "yellow", "red"]),
4577
- "comment": stringType().optional()
4810
+ "comment": stringType().max(createSnapshotBodyInitiativesItemStatusReportsItemTimelineCommentMax).optional()
4578
4811
  }),
4579
4812
  "budget": objectType({
4580
4813
  "rag": enumType(["green", "yellow", "red"]),
4581
- "comment": stringType().optional()
4814
+ "comment": stringType().max(createSnapshotBodyInitiativesItemStatusReportsItemBudgetCommentMax).optional()
4582
4815
  }),
4583
4816
  "skills": objectType({
4584
4817
  "rag": enumType(["green", "yellow", "red"]),
4585
- "comment": stringType().optional()
4818
+ "comment": stringType().max(createSnapshotBodyInitiativesItemStatusReportsItemSkillsCommentMax).optional()
4586
4819
  }),
4587
- "summary": stringType().optional()
4588
- })).optional(),
4589
- "dependsOn": arrayType(stringType()),
4820
+ "summary": stringType().max(createSnapshotBodyInitiativesItemStatusReportsItemSummaryMax).optional()
4821
+ })).max(createSnapshotBodyInitiativesItemStatusReportsMax).optional(),
4822
+ "dependsOn": arrayType(stringType()).max(createSnapshotBodyInitiativesItemDependsOnMax),
4590
4823
  "requiredSkills": arrayType(objectType({
4591
4824
  "skillId": stringType(),
4592
- "fte": numberType()
4593
- })).optional(),
4825
+ "fte": numberType(),
4826
+ "runFte": numberType().min(createSnapshotBodyInitiativesItemRequiredSkillsItemRunFteMin).optional()
4827
+ })).max(createSnapshotBodyInitiativesItemRequiredSkillsMax).optional(),
4828
+ "capabilityImpacts": arrayType(objectType({
4829
+ "capabilityId": stringType(),
4830
+ "kind": enumType(["improve", "new", "replace", "retire"]),
4831
+ "maturityTo": numberType().min(1).max(createSnapshotBodyInitiativesItemCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
4832
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(createSnapshotBodyInitiativesItemCapabilityImpactsMax).optional(),
4594
4833
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
4595
4834
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
4596
4835
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
4597
- "dpiaUrl": stringType().optional(),
4836
+ "dpiaUrl": stringType().max(createSnapshotBodyInitiativesItemDpiaUrlMax).optional(),
4598
4837
  "modelCardStatus": enumType(["Not Required", "Draft", "Published"]).optional(),
4599
- "modelCardUrl": stringType().optional(),
4600
- "prohibitedOverride": stringType().optional(),
4838
+ "modelCardUrl": stringType().max(createSnapshotBodyInitiativesItemModelCardUrlMax).optional(),
4839
+ "prohibitedOverride": stringType().max(createSnapshotBodyInitiativesItemProhibitedOverrideMax).optional(),
4601
4840
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
4602
4841
  "checked": booleanType(),
4603
4842
  "asOfDate": stringType().optional(),
4604
- "note": stringType().optional()
4843
+ "note": stringType().max(createSnapshotBodyInitiativesItemGateEvidenceNoteMax).optional(),
4844
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
4845
+ "checkedBy": objectType({
4846
+ "userId": stringType().uuid(),
4847
+ "name": stringType()
4848
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who ticked it. Ignored in requests.")
4605
4849
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
4606
4850
  "gateBypassed": booleanType().optional(),
4607
4851
  "aiAct": objectType({
@@ -4617,28 +4861,28 @@ var CreateSnapshotBody = objectType({
4617
4861
  "integratesThirdPartyGpai": booleanType().optional(),
4618
4862
  "upstreamGpaiProvider": stringType().optional(),
4619
4863
  "upstreamGpaiInfoAvailable": booleanType().optional(),
4620
- "prohibitedPractices": arrayType(stringType()),
4621
- "art50Flags": arrayType(stringType()),
4864
+ "prohibitedPractices": arrayType(stringType().max(createSnapshotBodyInitiativesItemAiActProhibitedPracticesItemMax)).max(createSnapshotBodyInitiativesItemAiActProhibitedPracticesMax),
4865
+ "art50Flags": arrayType(stringType().max(createSnapshotBodyInitiativesItemAiActArt50FlagsItemMax)).max(createSnapshotBodyInitiativesItemAiActArt50FlagsMax),
4622
4866
  "publicSector": booleanType().optional(),
4623
4867
  "establishedOutsideEU": booleanType().optional(),
4624
- "classificationRationale": stringType().optional(),
4868
+ "classificationRationale": stringType().max(createSnapshotBodyInitiativesItemAiActClassificationRationaleMax).optional(),
4625
4869
  "classificationConfirmed": booleanType().optional(),
4626
4870
  "classificationConfirmedBy": stringType().optional(),
4627
4871
  "classificationConfirmedAt": stringType().optional(),
4628
4872
  "artifacts": recordType(stringType(), objectType({
4629
4873
  "status": enumType(["Not started", "Draft", "In Review", "Approved", "Outdated"]),
4630
- "owner": stringType().optional(),
4874
+ "owner": stringType().max(createSnapshotBodyInitiativesItemAiActArtifactsOwnerMax).optional(),
4631
4875
  "lastReviewedAt": stringType().optional(),
4632
- "link": stringType().optional(),
4633
- "note": stringType().optional(),
4876
+ "link": stringType().max(createSnapshotBodyInitiativesItemAiActArtifactsLinkMax).optional(),
4877
+ "note": stringType().max(createSnapshotBodyInitiativesItemAiActArtifactsNoteMax).optional(),
4634
4878
  "maxAgeDays": numberType().optional()
4635
4879
  })).optional(),
4636
4880
  "obligations": recordType(stringType(), objectType({
4637
4881
  "status": enumType(["Not started", "In Progress", "Done", "N/A"]),
4638
- "owner": stringType().optional(),
4882
+ "owner": stringType().max(createSnapshotBodyInitiativesItemAiActObligationsOwnerMax).optional(),
4639
4883
  "dueDate": stringType().optional(),
4640
- "evidenceLink": stringType().optional(),
4641
- "approver": stringType().optional(),
4884
+ "evidenceLink": stringType().max(createSnapshotBodyInitiativesItemAiActObligationsEvidenceLinkMax).optional(),
4885
+ "approver": stringType().max(createSnapshotBodyInitiativesItemAiActObligationsApproverMax).optional(),
4642
4886
  "approvalDate": stringType().optional(),
4643
4887
  "reviewDate": stringType().optional()
4644
4888
  })).optional(),
@@ -4665,16 +4909,16 @@ var CreateSnapshotBody = objectType({
4665
4909
  "occurredAt": stringType(),
4666
4910
  "detectedAt": stringType(),
4667
4911
  "category": enumType(["general", "death-or-serious-damage", "cybersecurity", "fundamental-rights", "infrastructure-disruption"]),
4668
- "description": stringType(),
4912
+ "description": stringType().max(createSnapshotBodyInitiativesItemAiActIncidentsItemDescriptionMax),
4669
4913
  "status": enumType(["open", "reported", "closed"]),
4670
- "authorityRef": stringType().optional(),
4671
- "owner": stringType().optional(),
4672
- "rootCause": stringType().optional(),
4673
- "correctiveActions": stringType().optional(),
4914
+ "authorityRef": stringType().max(createSnapshotBodyInitiativesItemAiActIncidentsItemAuthorityRefMax).optional(),
4915
+ "owner": stringType().max(createSnapshotBodyInitiativesItemAiActIncidentsItemOwnerMax).optional(),
4916
+ "rootCause": stringType().max(createSnapshotBodyInitiativesItemAiActIncidentsItemRootCauseMax).optional(),
4917
+ "correctiveActions": stringType().max(createSnapshotBodyInitiativesItemAiActIncidentsItemCorrectiveActionsMax).optional(),
4674
4918
  "reportedAt": stringType().optional(),
4675
4919
  "createdAt": stringType(),
4676
4920
  "updatedAt": stringType()
4677
- })).optional()
4921
+ })).max(createSnapshotBodyInitiativesItemAiActIncidentsMax).optional()
4678
4922
  }).optional(),
4679
4923
  "createdBy": objectType({
4680
4924
  "userId": stringType().uuid(),
@@ -4684,9 +4928,11 @@ var CreateSnapshotBody = objectType({
4684
4928
  "userId": stringType().uuid(),
4685
4929
  "name": stringType()
4686
4930
  }).optional().describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body."),
4931
+ "version": numberType().min(1).optional().describe("Save counter, raised by the server on every save. A request names the version its edit is based on in InitiativeInput.baseVersion; this field is ignored in requests."),
4687
4932
  "createdAt": stringType(),
4688
4933
  "updatedAt": stringType()
4689
- }))
4934
+ })),
4935
+ "createdAt": stringType().optional().describe("Optional original creation timestamp (ISO 8601). Persisted when parseable, so a backup restore keeps each snapshot's real date instead of collapsing the whole timeline onto the restore date (and the client/server createdAt mismatch stops re-triggering a no-op rename on every sync). Unparseable or absent \u2014 the server stamps now, as before.")
4690
4936
  });
4691
4937
  var RenameSnapshotParams = objectType({
4692
4938
  "id": coerce.string().uuid()
@@ -4695,19 +4941,66 @@ var RenameSnapshotBody = objectType({
4695
4941
  "label": stringType(),
4696
4942
  "notes": stringType().optional()
4697
4943
  });
4944
+ var renameSnapshotResponseBusinessUnitsMax = 1e3;
4945
+ var renameSnapshotResponseInitiativesItemNameMax = 200;
4946
+ var renameSnapshotResponseInitiativesItemExternalIdMax = 200;
4947
+ var renameSnapshotResponseInitiativesItemBusinessUnitMax = 200;
4948
+ var renameSnapshotResponseInitiativesItemOwnerMax = 200;
4949
+ var renameSnapshotResponseInitiativesItemDescriptionMax = 1e4;
4950
+ var renameSnapshotResponseInitiativesItemAiCategoryMax = 200;
4951
+ var renameSnapshotResponseInitiativesItemTagsItemMax = 200;
4952
+ var renameSnapshotResponseInitiativesItemTagsMax = 1e3;
4953
+ var renameSnapshotResponseInitiativesItemDocsUrlMax = 2e3;
4954
+ var renameSnapshotResponseInitiativesItemPmUrlMax = 2e3;
4955
+ var renameSnapshotResponseInitiativesItemDecisionLogItemOwnerMax = 200;
4956
+ var renameSnapshotResponseInitiativesItemDecisionLogItemRationaleMax = 1e4;
4957
+ var renameSnapshotResponseInitiativesItemDecisionLogMax = 1e3;
4958
+ var renameSnapshotResponseInitiativesItemStatusReportsItemAuthorMax = 200;
4959
+ var renameSnapshotResponseInitiativesItemStatusReportsItemScopeCommentMax = 1e4;
4960
+ var renameSnapshotResponseInitiativesItemStatusReportsItemTimelineCommentMax = 1e4;
4961
+ var renameSnapshotResponseInitiativesItemStatusReportsItemBudgetCommentMax = 1e4;
4962
+ var renameSnapshotResponseInitiativesItemStatusReportsItemSkillsCommentMax = 1e4;
4963
+ var renameSnapshotResponseInitiativesItemStatusReportsItemSummaryMax = 1e4;
4964
+ var renameSnapshotResponseInitiativesItemStatusReportsMax = 1e3;
4965
+ var renameSnapshotResponseInitiativesItemDependsOnMax = 1e3;
4966
+ var renameSnapshotResponseInitiativesItemRequiredSkillsItemRunFteMin = 0;
4967
+ var renameSnapshotResponseInitiativesItemRequiredSkillsMax = 1e3;
4968
+ var renameSnapshotResponseInitiativesItemCapabilityImpactsItemMaturityToMax = 5;
4969
+ var renameSnapshotResponseInitiativesItemCapabilityImpactsMax = 1e3;
4970
+ var renameSnapshotResponseInitiativesItemDpiaUrlMax = 2e3;
4971
+ var renameSnapshotResponseInitiativesItemModelCardUrlMax = 2e3;
4972
+ var renameSnapshotResponseInitiativesItemProhibitedOverrideMax = 2e3;
4973
+ var renameSnapshotResponseInitiativesItemGateEvidenceNoteMax = 1e4;
4974
+ var renameSnapshotResponseInitiativesItemAiActProhibitedPracticesItemMax = 200;
4975
+ var renameSnapshotResponseInitiativesItemAiActProhibitedPracticesMax = 100;
4976
+ var renameSnapshotResponseInitiativesItemAiActArt50FlagsItemMax = 200;
4977
+ var renameSnapshotResponseInitiativesItemAiActArt50FlagsMax = 100;
4978
+ var renameSnapshotResponseInitiativesItemAiActClassificationRationaleMax = 1e4;
4979
+ var renameSnapshotResponseInitiativesItemAiActArtifactsOwnerMax = 200;
4980
+ var renameSnapshotResponseInitiativesItemAiActArtifactsLinkMax = 2e3;
4981
+ var renameSnapshotResponseInitiativesItemAiActArtifactsNoteMax = 1e4;
4982
+ var renameSnapshotResponseInitiativesItemAiActObligationsOwnerMax = 200;
4983
+ var renameSnapshotResponseInitiativesItemAiActObligationsEvidenceLinkMax = 2e3;
4984
+ var renameSnapshotResponseInitiativesItemAiActObligationsApproverMax = 200;
4985
+ var renameSnapshotResponseInitiativesItemAiActIncidentsItemDescriptionMax = 1e4;
4986
+ var renameSnapshotResponseInitiativesItemAiActIncidentsItemAuthorityRefMax = 2e3;
4987
+ var renameSnapshotResponseInitiativesItemAiActIncidentsItemOwnerMax = 200;
4988
+ var renameSnapshotResponseInitiativesItemAiActIncidentsItemRootCauseMax = 1e4;
4989
+ var renameSnapshotResponseInitiativesItemAiActIncidentsItemCorrectiveActionsMax = 1e4;
4990
+ var renameSnapshotResponseInitiativesItemAiActIncidentsMax = 1e3;
4698
4991
  var RenameSnapshotResponse = objectType({
4699
4992
  "id": stringType().uuid(),
4700
4993
  "label": stringType(),
4701
4994
  "notes": stringType(),
4702
4995
  "currency": stringType(),
4703
- "businessUnits": arrayType(stringType()),
4996
+ "businessUnits": arrayType(stringType()).max(renameSnapshotResponseBusinessUnitsMax),
4704
4997
  "initiatives": arrayType(objectType({
4705
4998
  "id": stringType(),
4706
- "name": stringType(),
4707
- "externalId": stringType().optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
4708
- "businessUnit": stringType(),
4709
- "owner": stringType(),
4710
- "description": stringType(),
4999
+ "name": stringType().max(renameSnapshotResponseInitiativesItemNameMax),
5000
+ "externalId": stringType().max(renameSnapshotResponseInitiativesItemExternalIdMax).optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
5001
+ "businessUnit": stringType().max(renameSnapshotResponseInitiativesItemBusinessUnitMax),
5002
+ "owner": stringType().max(renameSnapshotResponseInitiativesItemOwnerMax),
5003
+ "description": stringType().max(renameSnapshotResponseInitiativesItemDescriptionMax),
4711
5004
  "status": enumType(["Idea", "Pilot", "Scaling", "In Production", "On Hold", "Retired"]),
4712
5005
  "timelineStart": stringType(),
4713
5006
  "timelineEnd": stringType(),
@@ -4715,15 +5008,20 @@ var RenameSnapshotResponse = objectType({
4715
5008
  "budgetForwardLooking": numberType().optional(),
4716
5009
  "vendorDependency": enumType(["None", "Single Vendor", "Multi-Vendor", "Internal Build", "Hybrid"]),
4717
5010
  "solutionType": enumType(["Internal", "External", "Hybrid"]),
4718
- "aiCategory": stringType(),
4719
- "tags": arrayType(stringType()),
4720
- "docsUrl": stringType().optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
4721
- "pmUrl": stringType().optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
5011
+ "aiCategory": stringType().max(renameSnapshotResponseInitiativesItemAiCategoryMax),
5012
+ "tags": arrayType(stringType().max(renameSnapshotResponseInitiativesItemTagsItemMax)).max(renameSnapshotResponseInitiativesItemTagsMax),
5013
+ "docsUrl": stringType().max(renameSnapshotResponseInitiativesItemDocsUrlMax).optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
5014
+ "pmUrl": stringType().max(renameSnapshotResponseInitiativesItemPmUrlMax).optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
4722
5015
  "archived": booleanType(),
4723
5016
  "evaluation": objectType({
4724
5017
  "valueScale": objectType({
4725
5018
  "score": numberType(),
4726
- "confidence": enumType(["Low", "Medium", "High"])
5019
+ "confidence": enumType(["Low", "Medium", "High"]),
5020
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5021
+ "scoredBy": objectType({
5022
+ "userId": stringType().uuid(),
5023
+ "name": stringType()
5024
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4727
5025
  }).and(objectType({
4728
5026
  "subs": objectType({
4729
5027
  "frequencyOfProcess": numberType(),
@@ -4737,7 +5035,12 @@ var RenameSnapshotResponse = objectType({
4737
5035
  })),
4738
5036
  "feasibility": objectType({
4739
5037
  "score": numberType(),
4740
- "confidence": enumType(["Low", "Medium", "High"])
5038
+ "confidence": enumType(["Low", "Medium", "High"]),
5039
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5040
+ "scoredBy": objectType({
5041
+ "userId": stringType().uuid(),
5042
+ "name": stringType()
5043
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4741
5044
  }).and(objectType({
4742
5045
  "subs": objectType({
4743
5046
  "dataAvailability": numberType(),
@@ -4751,7 +5054,12 @@ var RenameSnapshotResponse = objectType({
4751
5054
  })),
4752
5055
  "governance": objectType({
4753
5056
  "score": numberType(),
4754
- "confidence": enumType(["Low", "Medium", "High"])
5057
+ "confidence": enumType(["Low", "Medium", "High"]),
5058
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5059
+ "scoredBy": objectType({
5060
+ "userId": stringType().uuid(),
5061
+ "name": stringType()
5062
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4755
5063
  }).and(objectType({
4756
5064
  "subs": objectType({
4757
5065
  "regulatoryExposure": numberType(),
@@ -4766,7 +5074,12 @@ var RenameSnapshotResponse = objectType({
4766
5074
  })),
4767
5075
  "strategic": objectType({
4768
5076
  "score": numberType(),
4769
- "confidence": enumType(["Low", "Medium", "High"])
5077
+ "confidence": enumType(["Low", "Medium", "High"]),
5078
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5079
+ "scoredBy": objectType({
5080
+ "userId": stringType().uuid(),
5081
+ "name": stringType()
5082
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4770
5083
  }).and(objectType({
4771
5084
  "subs": objectType({
4772
5085
  "strategicDifferentiation": numberType(),
@@ -4798,7 +5111,8 @@ var RenameSnapshotResponse = objectType({
4798
5111
  "y1Pct": numberType(),
4799
5112
  "y2Pct": numberType()
4800
5113
  }).optional(),
4801
- "discountRatePct": numberType().optional()
5114
+ "discountRatePct": numberType().optional(),
5115
+ "operatingCostAnnual": numberType().optional()
4802
5116
  }).optional(),
4803
5117
  "actuals": objectType({
4804
5118
  "operatingCostAnnual": numberType().optional(),
@@ -4818,48 +5132,64 @@ var RenameSnapshotResponse = objectType({
4818
5132
  "id": stringType(),
4819
5133
  "date": stringType(),
4820
5134
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
4821
- "owner": stringType().optional(),
4822
- "rationale": stringType().optional(),
4823
- "createdAt": stringType().optional()
4824
- })).optional(),
5135
+ "owner": stringType().max(renameSnapshotResponseInitiativesItemDecisionLogItemOwnerMax).optional(),
5136
+ "rationale": stringType().max(renameSnapshotResponseInitiativesItemDecisionLogItemRationaleMax).optional(),
5137
+ "createdAt": stringType().optional(),
5138
+ "recordedAt": stringType().optional().describe("Server stamp: when the entry was recorded or its content last changed (`date` is when the decision was taken). Absent on entries not saved since the stamps were introduced. Ignored in requests."),
5139
+ "recordedBy": objectType({
5140
+ "userId": stringType().uuid(),
5141
+ "name": stringType()
5142
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who recorded it. Ignored in requests.")
5143
+ })).max(renameSnapshotResponseInitiativesItemDecisionLogMax).optional(),
4825
5144
  "statusReports": arrayType(objectType({
4826
5145
  "id": stringType(),
4827
5146
  "date": stringType(),
4828
- "author": stringType().optional(),
5147
+ "author": stringType().max(renameSnapshotResponseInitiativesItemStatusReportsItemAuthorMax).optional(),
4829
5148
  "scope": objectType({
4830
5149
  "rag": enumType(["green", "yellow", "red"]),
4831
- "comment": stringType().optional()
5150
+ "comment": stringType().max(renameSnapshotResponseInitiativesItemStatusReportsItemScopeCommentMax).optional()
4832
5151
  }),
4833
5152
  "timeline": objectType({
4834
5153
  "rag": enumType(["green", "yellow", "red"]),
4835
- "comment": stringType().optional()
5154
+ "comment": stringType().max(renameSnapshotResponseInitiativesItemStatusReportsItemTimelineCommentMax).optional()
4836
5155
  }),
4837
5156
  "budget": objectType({
4838
5157
  "rag": enumType(["green", "yellow", "red"]),
4839
- "comment": stringType().optional()
5158
+ "comment": stringType().max(renameSnapshotResponseInitiativesItemStatusReportsItemBudgetCommentMax).optional()
4840
5159
  }),
4841
5160
  "skills": objectType({
4842
5161
  "rag": enumType(["green", "yellow", "red"]),
4843
- "comment": stringType().optional()
5162
+ "comment": stringType().max(renameSnapshotResponseInitiativesItemStatusReportsItemSkillsCommentMax).optional()
4844
5163
  }),
4845
- "summary": stringType().optional()
4846
- })).optional(),
4847
- "dependsOn": arrayType(stringType()),
5164
+ "summary": stringType().max(renameSnapshotResponseInitiativesItemStatusReportsItemSummaryMax).optional()
5165
+ })).max(renameSnapshotResponseInitiativesItemStatusReportsMax).optional(),
5166
+ "dependsOn": arrayType(stringType()).max(renameSnapshotResponseInitiativesItemDependsOnMax),
4848
5167
  "requiredSkills": arrayType(objectType({
4849
5168
  "skillId": stringType(),
4850
- "fte": numberType()
4851
- })).optional(),
5169
+ "fte": numberType(),
5170
+ "runFte": numberType().min(renameSnapshotResponseInitiativesItemRequiredSkillsItemRunFteMin).optional()
5171
+ })).max(renameSnapshotResponseInitiativesItemRequiredSkillsMax).optional(),
5172
+ "capabilityImpacts": arrayType(objectType({
5173
+ "capabilityId": stringType(),
5174
+ "kind": enumType(["improve", "new", "replace", "retire"]),
5175
+ "maturityTo": numberType().min(1).max(renameSnapshotResponseInitiativesItemCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
5176
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(renameSnapshotResponseInitiativesItemCapabilityImpactsMax).optional(),
4852
5177
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
4853
5178
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
4854
5179
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
4855
- "dpiaUrl": stringType().optional(),
5180
+ "dpiaUrl": stringType().max(renameSnapshotResponseInitiativesItemDpiaUrlMax).optional(),
4856
5181
  "modelCardStatus": enumType(["Not Required", "Draft", "Published"]).optional(),
4857
- "modelCardUrl": stringType().optional(),
4858
- "prohibitedOverride": stringType().optional(),
5182
+ "modelCardUrl": stringType().max(renameSnapshotResponseInitiativesItemModelCardUrlMax).optional(),
5183
+ "prohibitedOverride": stringType().max(renameSnapshotResponseInitiativesItemProhibitedOverrideMax).optional(),
4859
5184
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
4860
5185
  "checked": booleanType(),
4861
5186
  "asOfDate": stringType().optional(),
4862
- "note": stringType().optional()
5187
+ "note": stringType().max(renameSnapshotResponseInitiativesItemGateEvidenceNoteMax).optional(),
5188
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
5189
+ "checkedBy": objectType({
5190
+ "userId": stringType().uuid(),
5191
+ "name": stringType()
5192
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who ticked it. Ignored in requests.")
4863
5193
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
4864
5194
  "gateBypassed": booleanType().optional(),
4865
5195
  "aiAct": objectType({
@@ -4875,28 +5205,28 @@ var RenameSnapshotResponse = objectType({
4875
5205
  "integratesThirdPartyGpai": booleanType().optional(),
4876
5206
  "upstreamGpaiProvider": stringType().optional(),
4877
5207
  "upstreamGpaiInfoAvailable": booleanType().optional(),
4878
- "prohibitedPractices": arrayType(stringType()),
4879
- "art50Flags": arrayType(stringType()),
5208
+ "prohibitedPractices": arrayType(stringType().max(renameSnapshotResponseInitiativesItemAiActProhibitedPracticesItemMax)).max(renameSnapshotResponseInitiativesItemAiActProhibitedPracticesMax),
5209
+ "art50Flags": arrayType(stringType().max(renameSnapshotResponseInitiativesItemAiActArt50FlagsItemMax)).max(renameSnapshotResponseInitiativesItemAiActArt50FlagsMax),
4880
5210
  "publicSector": booleanType().optional(),
4881
5211
  "establishedOutsideEU": booleanType().optional(),
4882
- "classificationRationale": stringType().optional(),
5212
+ "classificationRationale": stringType().max(renameSnapshotResponseInitiativesItemAiActClassificationRationaleMax).optional(),
4883
5213
  "classificationConfirmed": booleanType().optional(),
4884
5214
  "classificationConfirmedBy": stringType().optional(),
4885
5215
  "classificationConfirmedAt": stringType().optional(),
4886
5216
  "artifacts": recordType(stringType(), objectType({
4887
5217
  "status": enumType(["Not started", "Draft", "In Review", "Approved", "Outdated"]),
4888
- "owner": stringType().optional(),
5218
+ "owner": stringType().max(renameSnapshotResponseInitiativesItemAiActArtifactsOwnerMax).optional(),
4889
5219
  "lastReviewedAt": stringType().optional(),
4890
- "link": stringType().optional(),
4891
- "note": stringType().optional(),
5220
+ "link": stringType().max(renameSnapshotResponseInitiativesItemAiActArtifactsLinkMax).optional(),
5221
+ "note": stringType().max(renameSnapshotResponseInitiativesItemAiActArtifactsNoteMax).optional(),
4892
5222
  "maxAgeDays": numberType().optional()
4893
5223
  })).optional(),
4894
5224
  "obligations": recordType(stringType(), objectType({
4895
5225
  "status": enumType(["Not started", "In Progress", "Done", "N/A"]),
4896
- "owner": stringType().optional(),
5226
+ "owner": stringType().max(renameSnapshotResponseInitiativesItemAiActObligationsOwnerMax).optional(),
4897
5227
  "dueDate": stringType().optional(),
4898
- "evidenceLink": stringType().optional(),
4899
- "approver": stringType().optional(),
5228
+ "evidenceLink": stringType().max(renameSnapshotResponseInitiativesItemAiActObligationsEvidenceLinkMax).optional(),
5229
+ "approver": stringType().max(renameSnapshotResponseInitiativesItemAiActObligationsApproverMax).optional(),
4900
5230
  "approvalDate": stringType().optional(),
4901
5231
  "reviewDate": stringType().optional()
4902
5232
  })).optional(),
@@ -4923,16 +5253,16 @@ var RenameSnapshotResponse = objectType({
4923
5253
  "occurredAt": stringType(),
4924
5254
  "detectedAt": stringType(),
4925
5255
  "category": enumType(["general", "death-or-serious-damage", "cybersecurity", "fundamental-rights", "infrastructure-disruption"]),
4926
- "description": stringType(),
5256
+ "description": stringType().max(renameSnapshotResponseInitiativesItemAiActIncidentsItemDescriptionMax),
4927
5257
  "status": enumType(["open", "reported", "closed"]),
4928
- "authorityRef": stringType().optional(),
4929
- "owner": stringType().optional(),
4930
- "rootCause": stringType().optional(),
4931
- "correctiveActions": stringType().optional(),
5258
+ "authorityRef": stringType().max(renameSnapshotResponseInitiativesItemAiActIncidentsItemAuthorityRefMax).optional(),
5259
+ "owner": stringType().max(renameSnapshotResponseInitiativesItemAiActIncidentsItemOwnerMax).optional(),
5260
+ "rootCause": stringType().max(renameSnapshotResponseInitiativesItemAiActIncidentsItemRootCauseMax).optional(),
5261
+ "correctiveActions": stringType().max(renameSnapshotResponseInitiativesItemAiActIncidentsItemCorrectiveActionsMax).optional(),
4932
5262
  "reportedAt": stringType().optional(),
4933
5263
  "createdAt": stringType(),
4934
5264
  "updatedAt": stringType()
4935
- })).optional()
5265
+ })).max(renameSnapshotResponseInitiativesItemAiActIncidentsMax).optional()
4936
5266
  }).optional(),
4937
5267
  "createdBy": objectType({
4938
5268
  "userId": stringType().uuid(),
@@ -4942,6 +5272,7 @@ var RenameSnapshotResponse = objectType({
4942
5272
  "userId": stringType().uuid(),
4943
5273
  "name": stringType()
4944
5274
  }).optional().describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body."),
5275
+ "version": numberType().min(1).optional().describe("Save counter, raised by the server on every save. A request names the version its edit is based on in InitiativeInput.baseVersion; this field is ignored in requests."),
4945
5276
  "createdAt": stringType(),
4946
5277
  "updatedAt": stringType()
4947
5278
  })),
@@ -4950,13 +5281,59 @@ var RenameSnapshotResponse = objectType({
4950
5281
  var DeleteSnapshotParams = objectType({
4951
5282
  "id": coerce.string().uuid()
4952
5283
  });
5284
+ var listInitiativesResponseNameMax = 200;
5285
+ var listInitiativesResponseExternalIdMax = 200;
5286
+ var listInitiativesResponseBusinessUnitMax = 200;
5287
+ var listInitiativesResponseOwnerMax = 200;
5288
+ var listInitiativesResponseDescriptionMax = 1e4;
5289
+ var listInitiativesResponseAiCategoryMax = 200;
5290
+ var listInitiativesResponseTagsItemMax = 200;
5291
+ var listInitiativesResponseTagsMax = 1e3;
5292
+ var listInitiativesResponseDocsUrlMax = 2e3;
5293
+ var listInitiativesResponsePmUrlMax = 2e3;
5294
+ var listInitiativesResponseDecisionLogItemOwnerMax = 200;
5295
+ var listInitiativesResponseDecisionLogItemRationaleMax = 1e4;
5296
+ var listInitiativesResponseDecisionLogMax = 1e3;
5297
+ var listInitiativesResponseStatusReportsItemAuthorMax = 200;
5298
+ var listInitiativesResponseStatusReportsItemScopeCommentMax = 1e4;
5299
+ var listInitiativesResponseStatusReportsItemTimelineCommentMax = 1e4;
5300
+ var listInitiativesResponseStatusReportsItemBudgetCommentMax = 1e4;
5301
+ var listInitiativesResponseStatusReportsItemSkillsCommentMax = 1e4;
5302
+ var listInitiativesResponseStatusReportsItemSummaryMax = 1e4;
5303
+ var listInitiativesResponseStatusReportsMax = 1e3;
5304
+ var listInitiativesResponseDependsOnMax = 1e3;
5305
+ var listInitiativesResponseRequiredSkillsItemRunFteMin = 0;
5306
+ var listInitiativesResponseRequiredSkillsMax = 1e3;
5307
+ var listInitiativesResponseCapabilityImpactsItemMaturityToMax = 5;
5308
+ var listInitiativesResponseCapabilityImpactsMax = 1e3;
5309
+ var listInitiativesResponseDpiaUrlMax = 2e3;
5310
+ var listInitiativesResponseModelCardUrlMax = 2e3;
5311
+ var listInitiativesResponseProhibitedOverrideMax = 2e3;
5312
+ var listInitiativesResponseGateEvidenceNoteMax = 1e4;
5313
+ var listInitiativesResponseAiActProhibitedPracticesItemMax = 200;
5314
+ var listInitiativesResponseAiActProhibitedPracticesMax = 100;
5315
+ var listInitiativesResponseAiActArt50FlagsItemMax = 200;
5316
+ var listInitiativesResponseAiActArt50FlagsMax = 100;
5317
+ var listInitiativesResponseAiActClassificationRationaleMax = 1e4;
5318
+ var listInitiativesResponseAiActArtifactsOwnerMax = 200;
5319
+ var listInitiativesResponseAiActArtifactsLinkMax = 2e3;
5320
+ var listInitiativesResponseAiActArtifactsNoteMax = 1e4;
5321
+ var listInitiativesResponseAiActObligationsOwnerMax = 200;
5322
+ var listInitiativesResponseAiActObligationsEvidenceLinkMax = 2e3;
5323
+ var listInitiativesResponseAiActObligationsApproverMax = 200;
5324
+ var listInitiativesResponseAiActIncidentsItemDescriptionMax = 1e4;
5325
+ var listInitiativesResponseAiActIncidentsItemAuthorityRefMax = 2e3;
5326
+ var listInitiativesResponseAiActIncidentsItemOwnerMax = 200;
5327
+ var listInitiativesResponseAiActIncidentsItemRootCauseMax = 1e4;
5328
+ var listInitiativesResponseAiActIncidentsItemCorrectiveActionsMax = 1e4;
5329
+ var listInitiativesResponseAiActIncidentsMax = 1e3;
4953
5330
  var ListInitiativesResponseItem = objectType({
4954
5331
  "id": stringType(),
4955
- "name": stringType(),
4956
- "externalId": stringType().optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
4957
- "businessUnit": stringType(),
4958
- "owner": stringType(),
4959
- "description": stringType(),
5332
+ "name": stringType().max(listInitiativesResponseNameMax),
5333
+ "externalId": stringType().max(listInitiativesResponseExternalIdMax).optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
5334
+ "businessUnit": stringType().max(listInitiativesResponseBusinessUnitMax),
5335
+ "owner": stringType().max(listInitiativesResponseOwnerMax),
5336
+ "description": stringType().max(listInitiativesResponseDescriptionMax),
4960
5337
  "status": enumType(["Idea", "Pilot", "Scaling", "In Production", "On Hold", "Retired"]),
4961
5338
  "timelineStart": stringType(),
4962
5339
  "timelineEnd": stringType(),
@@ -4964,15 +5341,20 @@ var ListInitiativesResponseItem = objectType({
4964
5341
  "budgetForwardLooking": numberType().optional(),
4965
5342
  "vendorDependency": enumType(["None", "Single Vendor", "Multi-Vendor", "Internal Build", "Hybrid"]),
4966
5343
  "solutionType": enumType(["Internal", "External", "Hybrid"]),
4967
- "aiCategory": stringType(),
4968
- "tags": arrayType(stringType()),
4969
- "docsUrl": stringType().optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
4970
- "pmUrl": stringType().optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
5344
+ "aiCategory": stringType().max(listInitiativesResponseAiCategoryMax),
5345
+ "tags": arrayType(stringType().max(listInitiativesResponseTagsItemMax)).max(listInitiativesResponseTagsMax),
5346
+ "docsUrl": stringType().max(listInitiativesResponseDocsUrlMax).optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
5347
+ "pmUrl": stringType().max(listInitiativesResponsePmUrlMax).optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
4971
5348
  "archived": booleanType(),
4972
5349
  "evaluation": objectType({
4973
5350
  "valueScale": objectType({
4974
5351
  "score": numberType(),
4975
- "confidence": enumType(["Low", "Medium", "High"])
5352
+ "confidence": enumType(["Low", "Medium", "High"]),
5353
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5354
+ "scoredBy": objectType({
5355
+ "userId": stringType().uuid(),
5356
+ "name": stringType()
5357
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4976
5358
  }).and(objectType({
4977
5359
  "subs": objectType({
4978
5360
  "frequencyOfProcess": numberType(),
@@ -4986,7 +5368,12 @@ var ListInitiativesResponseItem = objectType({
4986
5368
  })),
4987
5369
  "feasibility": objectType({
4988
5370
  "score": numberType(),
4989
- "confidence": enumType(["Low", "Medium", "High"])
5371
+ "confidence": enumType(["Low", "Medium", "High"]),
5372
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5373
+ "scoredBy": objectType({
5374
+ "userId": stringType().uuid(),
5375
+ "name": stringType()
5376
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
4990
5377
  }).and(objectType({
4991
5378
  "subs": objectType({
4992
5379
  "dataAvailability": numberType(),
@@ -5000,7 +5387,12 @@ var ListInitiativesResponseItem = objectType({
5000
5387
  })),
5001
5388
  "governance": objectType({
5002
5389
  "score": numberType(),
5003
- "confidence": enumType(["Low", "Medium", "High"])
5390
+ "confidence": enumType(["Low", "Medium", "High"]),
5391
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5392
+ "scoredBy": objectType({
5393
+ "userId": stringType().uuid(),
5394
+ "name": stringType()
5395
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5004
5396
  }).and(objectType({
5005
5397
  "subs": objectType({
5006
5398
  "regulatoryExposure": numberType(),
@@ -5015,7 +5407,12 @@ var ListInitiativesResponseItem = objectType({
5015
5407
  })),
5016
5408
  "strategic": objectType({
5017
5409
  "score": numberType(),
5018
- "confidence": enumType(["Low", "Medium", "High"])
5410
+ "confidence": enumType(["Low", "Medium", "High"]),
5411
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5412
+ "scoredBy": objectType({
5413
+ "userId": stringType().uuid(),
5414
+ "name": stringType()
5415
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5019
5416
  }).and(objectType({
5020
5417
  "subs": objectType({
5021
5418
  "strategicDifferentiation": numberType(),
@@ -5047,7 +5444,8 @@ var ListInitiativesResponseItem = objectType({
5047
5444
  "y1Pct": numberType(),
5048
5445
  "y2Pct": numberType()
5049
5446
  }).optional(),
5050
- "discountRatePct": numberType().optional()
5447
+ "discountRatePct": numberType().optional(),
5448
+ "operatingCostAnnual": numberType().optional()
5051
5449
  }).optional(),
5052
5450
  "actuals": objectType({
5053
5451
  "operatingCostAnnual": numberType().optional(),
@@ -5067,48 +5465,64 @@ var ListInitiativesResponseItem = objectType({
5067
5465
  "id": stringType(),
5068
5466
  "date": stringType(),
5069
5467
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
5070
- "owner": stringType().optional(),
5071
- "rationale": stringType().optional(),
5072
- "createdAt": stringType().optional()
5073
- })).optional(),
5468
+ "owner": stringType().max(listInitiativesResponseDecisionLogItemOwnerMax).optional(),
5469
+ "rationale": stringType().max(listInitiativesResponseDecisionLogItemRationaleMax).optional(),
5470
+ "createdAt": stringType().optional(),
5471
+ "recordedAt": stringType().optional().describe("Server stamp: when the entry was recorded or its content last changed (`date` is when the decision was taken). Absent on entries not saved since the stamps were introduced. Ignored in requests."),
5472
+ "recordedBy": objectType({
5473
+ "userId": stringType().uuid(),
5474
+ "name": stringType()
5475
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who recorded it. Ignored in requests.")
5476
+ })).max(listInitiativesResponseDecisionLogMax).optional(),
5074
5477
  "statusReports": arrayType(objectType({
5075
5478
  "id": stringType(),
5076
5479
  "date": stringType(),
5077
- "author": stringType().optional(),
5480
+ "author": stringType().max(listInitiativesResponseStatusReportsItemAuthorMax).optional(),
5078
5481
  "scope": objectType({
5079
5482
  "rag": enumType(["green", "yellow", "red"]),
5080
- "comment": stringType().optional()
5483
+ "comment": stringType().max(listInitiativesResponseStatusReportsItemScopeCommentMax).optional()
5081
5484
  }),
5082
5485
  "timeline": objectType({
5083
5486
  "rag": enumType(["green", "yellow", "red"]),
5084
- "comment": stringType().optional()
5487
+ "comment": stringType().max(listInitiativesResponseStatusReportsItemTimelineCommentMax).optional()
5085
5488
  }),
5086
5489
  "budget": objectType({
5087
5490
  "rag": enumType(["green", "yellow", "red"]),
5088
- "comment": stringType().optional()
5491
+ "comment": stringType().max(listInitiativesResponseStatusReportsItemBudgetCommentMax).optional()
5089
5492
  }),
5090
5493
  "skills": objectType({
5091
5494
  "rag": enumType(["green", "yellow", "red"]),
5092
- "comment": stringType().optional()
5495
+ "comment": stringType().max(listInitiativesResponseStatusReportsItemSkillsCommentMax).optional()
5093
5496
  }),
5094
- "summary": stringType().optional()
5095
- })).optional(),
5096
- "dependsOn": arrayType(stringType()),
5497
+ "summary": stringType().max(listInitiativesResponseStatusReportsItemSummaryMax).optional()
5498
+ })).max(listInitiativesResponseStatusReportsMax).optional(),
5499
+ "dependsOn": arrayType(stringType()).max(listInitiativesResponseDependsOnMax),
5097
5500
  "requiredSkills": arrayType(objectType({
5098
5501
  "skillId": stringType(),
5099
- "fte": numberType()
5100
- })).optional(),
5502
+ "fte": numberType(),
5503
+ "runFte": numberType().min(listInitiativesResponseRequiredSkillsItemRunFteMin).optional()
5504
+ })).max(listInitiativesResponseRequiredSkillsMax).optional(),
5505
+ "capabilityImpacts": arrayType(objectType({
5506
+ "capabilityId": stringType(),
5507
+ "kind": enumType(["improve", "new", "replace", "retire"]),
5508
+ "maturityTo": numberType().min(1).max(listInitiativesResponseCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
5509
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(listInitiativesResponseCapabilityImpactsMax).optional(),
5101
5510
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
5102
5511
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
5103
5512
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
5104
- "dpiaUrl": stringType().optional(),
5513
+ "dpiaUrl": stringType().max(listInitiativesResponseDpiaUrlMax).optional(),
5105
5514
  "modelCardStatus": enumType(["Not Required", "Draft", "Published"]).optional(),
5106
- "modelCardUrl": stringType().optional(),
5107
- "prohibitedOverride": stringType().optional(),
5515
+ "modelCardUrl": stringType().max(listInitiativesResponseModelCardUrlMax).optional(),
5516
+ "prohibitedOverride": stringType().max(listInitiativesResponseProhibitedOverrideMax).optional(),
5108
5517
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
5109
5518
  "checked": booleanType(),
5110
5519
  "asOfDate": stringType().optional(),
5111
- "note": stringType().optional()
5520
+ "note": stringType().max(listInitiativesResponseGateEvidenceNoteMax).optional(),
5521
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
5522
+ "checkedBy": objectType({
5523
+ "userId": stringType().uuid(),
5524
+ "name": stringType()
5525
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who ticked it. Ignored in requests.")
5112
5526
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
5113
5527
  "gateBypassed": booleanType().optional(),
5114
5528
  "aiAct": objectType({
@@ -5124,28 +5538,28 @@ var ListInitiativesResponseItem = objectType({
5124
5538
  "integratesThirdPartyGpai": booleanType().optional(),
5125
5539
  "upstreamGpaiProvider": stringType().optional(),
5126
5540
  "upstreamGpaiInfoAvailable": booleanType().optional(),
5127
- "prohibitedPractices": arrayType(stringType()),
5128
- "art50Flags": arrayType(stringType()),
5541
+ "prohibitedPractices": arrayType(stringType().max(listInitiativesResponseAiActProhibitedPracticesItemMax)).max(listInitiativesResponseAiActProhibitedPracticesMax),
5542
+ "art50Flags": arrayType(stringType().max(listInitiativesResponseAiActArt50FlagsItemMax)).max(listInitiativesResponseAiActArt50FlagsMax),
5129
5543
  "publicSector": booleanType().optional(),
5130
5544
  "establishedOutsideEU": booleanType().optional(),
5131
- "classificationRationale": stringType().optional(),
5545
+ "classificationRationale": stringType().max(listInitiativesResponseAiActClassificationRationaleMax).optional(),
5132
5546
  "classificationConfirmed": booleanType().optional(),
5133
5547
  "classificationConfirmedBy": stringType().optional(),
5134
5548
  "classificationConfirmedAt": stringType().optional(),
5135
5549
  "artifacts": recordType(stringType(), objectType({
5136
5550
  "status": enumType(["Not started", "Draft", "In Review", "Approved", "Outdated"]),
5137
- "owner": stringType().optional(),
5551
+ "owner": stringType().max(listInitiativesResponseAiActArtifactsOwnerMax).optional(),
5138
5552
  "lastReviewedAt": stringType().optional(),
5139
- "link": stringType().optional(),
5140
- "note": stringType().optional(),
5553
+ "link": stringType().max(listInitiativesResponseAiActArtifactsLinkMax).optional(),
5554
+ "note": stringType().max(listInitiativesResponseAiActArtifactsNoteMax).optional(),
5141
5555
  "maxAgeDays": numberType().optional()
5142
5556
  })).optional(),
5143
5557
  "obligations": recordType(stringType(), objectType({
5144
5558
  "status": enumType(["Not started", "In Progress", "Done", "N/A"]),
5145
- "owner": stringType().optional(),
5559
+ "owner": stringType().max(listInitiativesResponseAiActObligationsOwnerMax).optional(),
5146
5560
  "dueDate": stringType().optional(),
5147
- "evidenceLink": stringType().optional(),
5148
- "approver": stringType().optional(),
5561
+ "evidenceLink": stringType().max(listInitiativesResponseAiActObligationsEvidenceLinkMax).optional(),
5562
+ "approver": stringType().max(listInitiativesResponseAiActObligationsApproverMax).optional(),
5149
5563
  "approvalDate": stringType().optional(),
5150
5564
  "reviewDate": stringType().optional()
5151
5565
  })).optional(),
@@ -5172,16 +5586,16 @@ var ListInitiativesResponseItem = objectType({
5172
5586
  "occurredAt": stringType(),
5173
5587
  "detectedAt": stringType(),
5174
5588
  "category": enumType(["general", "death-or-serious-damage", "cybersecurity", "fundamental-rights", "infrastructure-disruption"]),
5175
- "description": stringType(),
5589
+ "description": stringType().max(listInitiativesResponseAiActIncidentsItemDescriptionMax),
5176
5590
  "status": enumType(["open", "reported", "closed"]),
5177
- "authorityRef": stringType().optional(),
5178
- "owner": stringType().optional(),
5179
- "rootCause": stringType().optional(),
5180
- "correctiveActions": stringType().optional(),
5591
+ "authorityRef": stringType().max(listInitiativesResponseAiActIncidentsItemAuthorityRefMax).optional(),
5592
+ "owner": stringType().max(listInitiativesResponseAiActIncidentsItemOwnerMax).optional(),
5593
+ "rootCause": stringType().max(listInitiativesResponseAiActIncidentsItemRootCauseMax).optional(),
5594
+ "correctiveActions": stringType().max(listInitiativesResponseAiActIncidentsItemCorrectiveActionsMax).optional(),
5181
5595
  "reportedAt": stringType().optional(),
5182
5596
  "createdAt": stringType(),
5183
5597
  "updatedAt": stringType()
5184
- })).optional()
5598
+ })).max(listInitiativesResponseAiActIncidentsMax).optional()
5185
5599
  }).optional(),
5186
5600
  "createdBy": objectType({
5187
5601
  "userId": stringType().uuid(),
@@ -5191,17 +5605,64 @@ var ListInitiativesResponseItem = objectType({
5191
5605
  "userId": stringType().uuid(),
5192
5606
  "name": stringType()
5193
5607
  }).optional().describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body."),
5608
+ "version": numberType().min(1).optional().describe("Save counter, raised by the server on every save. A request names the version its edit is based on in InitiativeInput.baseVersion; this field is ignored in requests."),
5194
5609
  "createdAt": stringType(),
5195
5610
  "updatedAt": stringType()
5196
5611
  });
5197
5612
  var ListInitiativesResponse = arrayType(ListInitiativesResponseItem);
5613
+ var createInitiativeBodyOneNameMax = 200;
5614
+ var createInitiativeBodyOneExternalIdMax = 200;
5615
+ var createInitiativeBodyOneBusinessUnitMax = 200;
5616
+ var createInitiativeBodyOneOwnerMax = 200;
5617
+ var createInitiativeBodyOneDescriptionMax = 1e4;
5618
+ var createInitiativeBodyOneAiCategoryMax = 200;
5619
+ var createInitiativeBodyOneTagsItemMax = 200;
5620
+ var createInitiativeBodyOneTagsMax = 1e3;
5621
+ var createInitiativeBodyOneDocsUrlMax = 2e3;
5622
+ var createInitiativeBodyOnePmUrlMax = 2e3;
5623
+ var createInitiativeBodyOneDecisionLogItemOwnerMax = 200;
5624
+ var createInitiativeBodyOneDecisionLogItemRationaleMax = 1e4;
5625
+ var createInitiativeBodyOneDecisionLogMax = 1e3;
5626
+ var createInitiativeBodyOneStatusReportsItemAuthorMax = 200;
5627
+ var createInitiativeBodyOneStatusReportsItemScopeCommentMax = 1e4;
5628
+ var createInitiativeBodyOneStatusReportsItemTimelineCommentMax = 1e4;
5629
+ var createInitiativeBodyOneStatusReportsItemBudgetCommentMax = 1e4;
5630
+ var createInitiativeBodyOneStatusReportsItemSkillsCommentMax = 1e4;
5631
+ var createInitiativeBodyOneStatusReportsItemSummaryMax = 1e4;
5632
+ var createInitiativeBodyOneStatusReportsMax = 1e3;
5633
+ var createInitiativeBodyOneDependsOnMax = 1e3;
5634
+ var createInitiativeBodyOneRequiredSkillsItemRunFteMin = 0;
5635
+ var createInitiativeBodyOneRequiredSkillsMax = 1e3;
5636
+ var createInitiativeBodyOneCapabilityImpactsItemMaturityToMax = 5;
5637
+ var createInitiativeBodyOneCapabilityImpactsMax = 1e3;
5638
+ var createInitiativeBodyOneDpiaUrlMax = 2e3;
5639
+ var createInitiativeBodyOneModelCardUrlMax = 2e3;
5640
+ var createInitiativeBodyOneProhibitedOverrideMax = 2e3;
5641
+ var createInitiativeBodyOneGateEvidenceNoteMax = 1e4;
5642
+ var createInitiativeBodyOneAiActProhibitedPracticesItemMax = 200;
5643
+ var createInitiativeBodyOneAiActProhibitedPracticesMax = 100;
5644
+ var createInitiativeBodyOneAiActArt50FlagsItemMax = 200;
5645
+ var createInitiativeBodyOneAiActArt50FlagsMax = 100;
5646
+ var createInitiativeBodyOneAiActClassificationRationaleMax = 1e4;
5647
+ var createInitiativeBodyOneAiActArtifactsOwnerMax = 200;
5648
+ var createInitiativeBodyOneAiActArtifactsLinkMax = 2e3;
5649
+ var createInitiativeBodyOneAiActArtifactsNoteMax = 1e4;
5650
+ var createInitiativeBodyOneAiActObligationsOwnerMax = 200;
5651
+ var createInitiativeBodyOneAiActObligationsEvidenceLinkMax = 2e3;
5652
+ var createInitiativeBodyOneAiActObligationsApproverMax = 200;
5653
+ var createInitiativeBodyOneAiActIncidentsItemDescriptionMax = 1e4;
5654
+ var createInitiativeBodyOneAiActIncidentsItemAuthorityRefMax = 2e3;
5655
+ var createInitiativeBodyOneAiActIncidentsItemOwnerMax = 200;
5656
+ var createInitiativeBodyOneAiActIncidentsItemRootCauseMax = 1e4;
5657
+ var createInitiativeBodyOneAiActIncidentsItemCorrectiveActionsMax = 1e4;
5658
+ var createInitiativeBodyOneAiActIncidentsMax = 1e3;
5198
5659
  var CreateInitiativeBody = objectType({
5199
5660
  "id": stringType(),
5200
- "name": stringType(),
5201
- "externalId": stringType().optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
5202
- "businessUnit": stringType(),
5203
- "owner": stringType(),
5204
- "description": stringType(),
5661
+ "name": stringType().max(createInitiativeBodyOneNameMax),
5662
+ "externalId": stringType().max(createInitiativeBodyOneExternalIdMax).optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
5663
+ "businessUnit": stringType().max(createInitiativeBodyOneBusinessUnitMax),
5664
+ "owner": stringType().max(createInitiativeBodyOneOwnerMax),
5665
+ "description": stringType().max(createInitiativeBodyOneDescriptionMax),
5205
5666
  "status": enumType(["Idea", "Pilot", "Scaling", "In Production", "On Hold", "Retired"]),
5206
5667
  "timelineStart": stringType(),
5207
5668
  "timelineEnd": stringType(),
@@ -5209,15 +5670,20 @@ var CreateInitiativeBody = objectType({
5209
5670
  "budgetForwardLooking": numberType().optional(),
5210
5671
  "vendorDependency": enumType(["None", "Single Vendor", "Multi-Vendor", "Internal Build", "Hybrid"]),
5211
5672
  "solutionType": enumType(["Internal", "External", "Hybrid"]),
5212
- "aiCategory": stringType(),
5213
- "tags": arrayType(stringType()),
5214
- "docsUrl": stringType().optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
5215
- "pmUrl": stringType().optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
5673
+ "aiCategory": stringType().max(createInitiativeBodyOneAiCategoryMax),
5674
+ "tags": arrayType(stringType().max(createInitiativeBodyOneTagsItemMax)).max(createInitiativeBodyOneTagsMax),
5675
+ "docsUrl": stringType().max(createInitiativeBodyOneDocsUrlMax).optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
5676
+ "pmUrl": stringType().max(createInitiativeBodyOnePmUrlMax).optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
5216
5677
  "archived": booleanType(),
5217
5678
  "evaluation": objectType({
5218
5679
  "valueScale": objectType({
5219
5680
  "score": numberType(),
5220
- "confidence": enumType(["Low", "Medium", "High"])
5681
+ "confidence": enumType(["Low", "Medium", "High"]),
5682
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5683
+ "scoredBy": objectType({
5684
+ "userId": stringType().uuid(),
5685
+ "name": stringType()
5686
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5221
5687
  }).and(objectType({
5222
5688
  "subs": objectType({
5223
5689
  "frequencyOfProcess": numberType(),
@@ -5231,7 +5697,12 @@ var CreateInitiativeBody = objectType({
5231
5697
  })),
5232
5698
  "feasibility": objectType({
5233
5699
  "score": numberType(),
5234
- "confidence": enumType(["Low", "Medium", "High"])
5700
+ "confidence": enumType(["Low", "Medium", "High"]),
5701
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5702
+ "scoredBy": objectType({
5703
+ "userId": stringType().uuid(),
5704
+ "name": stringType()
5705
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5235
5706
  }).and(objectType({
5236
5707
  "subs": objectType({
5237
5708
  "dataAvailability": numberType(),
@@ -5245,7 +5716,12 @@ var CreateInitiativeBody = objectType({
5245
5716
  })),
5246
5717
  "governance": objectType({
5247
5718
  "score": numberType(),
5248
- "confidence": enumType(["Low", "Medium", "High"])
5719
+ "confidence": enumType(["Low", "Medium", "High"]),
5720
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5721
+ "scoredBy": objectType({
5722
+ "userId": stringType().uuid(),
5723
+ "name": stringType()
5724
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5249
5725
  }).and(objectType({
5250
5726
  "subs": objectType({
5251
5727
  "regulatoryExposure": numberType(),
@@ -5260,7 +5736,12 @@ var CreateInitiativeBody = objectType({
5260
5736
  })),
5261
5737
  "strategic": objectType({
5262
5738
  "score": numberType(),
5263
- "confidence": enumType(["Low", "Medium", "High"])
5739
+ "confidence": enumType(["Low", "Medium", "High"]),
5740
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
5741
+ "scoredBy": objectType({
5742
+ "userId": stringType().uuid(),
5743
+ "name": stringType()
5744
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5264
5745
  }).and(objectType({
5265
5746
  "subs": objectType({
5266
5747
  "strategicDifferentiation": numberType(),
@@ -5292,7 +5773,8 @@ var CreateInitiativeBody = objectType({
5292
5773
  "y1Pct": numberType(),
5293
5774
  "y2Pct": numberType()
5294
5775
  }).optional(),
5295
- "discountRatePct": numberType().optional()
5776
+ "discountRatePct": numberType().optional(),
5777
+ "operatingCostAnnual": numberType().optional()
5296
5778
  }).optional(),
5297
5779
  "actuals": objectType({
5298
5780
  "operatingCostAnnual": numberType().optional(),
@@ -5312,48 +5794,64 @@ var CreateInitiativeBody = objectType({
5312
5794
  "id": stringType(),
5313
5795
  "date": stringType(),
5314
5796
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
5315
- "owner": stringType().optional(),
5316
- "rationale": stringType().optional(),
5317
- "createdAt": stringType().optional()
5318
- })).optional(),
5797
+ "owner": stringType().max(createInitiativeBodyOneDecisionLogItemOwnerMax).optional(),
5798
+ "rationale": stringType().max(createInitiativeBodyOneDecisionLogItemRationaleMax).optional(),
5799
+ "createdAt": stringType().optional(),
5800
+ "recordedAt": stringType().optional().describe("Server stamp: when the entry was recorded or its content last changed (`date` is when the decision was taken). Absent on entries not saved since the stamps were introduced. Ignored in requests."),
5801
+ "recordedBy": objectType({
5802
+ "userId": stringType().uuid(),
5803
+ "name": stringType()
5804
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who recorded it. Ignored in requests.")
5805
+ })).max(createInitiativeBodyOneDecisionLogMax).optional(),
5319
5806
  "statusReports": arrayType(objectType({
5320
5807
  "id": stringType(),
5321
5808
  "date": stringType(),
5322
- "author": stringType().optional(),
5809
+ "author": stringType().max(createInitiativeBodyOneStatusReportsItemAuthorMax).optional(),
5323
5810
  "scope": objectType({
5324
5811
  "rag": enumType(["green", "yellow", "red"]),
5325
- "comment": stringType().optional()
5812
+ "comment": stringType().max(createInitiativeBodyOneStatusReportsItemScopeCommentMax).optional()
5326
5813
  }),
5327
5814
  "timeline": objectType({
5328
5815
  "rag": enumType(["green", "yellow", "red"]),
5329
- "comment": stringType().optional()
5816
+ "comment": stringType().max(createInitiativeBodyOneStatusReportsItemTimelineCommentMax).optional()
5330
5817
  }),
5331
5818
  "budget": objectType({
5332
5819
  "rag": enumType(["green", "yellow", "red"]),
5333
- "comment": stringType().optional()
5820
+ "comment": stringType().max(createInitiativeBodyOneStatusReportsItemBudgetCommentMax).optional()
5334
5821
  }),
5335
5822
  "skills": objectType({
5336
5823
  "rag": enumType(["green", "yellow", "red"]),
5337
- "comment": stringType().optional()
5824
+ "comment": stringType().max(createInitiativeBodyOneStatusReportsItemSkillsCommentMax).optional()
5338
5825
  }),
5339
- "summary": stringType().optional()
5340
- })).optional(),
5341
- "dependsOn": arrayType(stringType()),
5826
+ "summary": stringType().max(createInitiativeBodyOneStatusReportsItemSummaryMax).optional()
5827
+ })).max(createInitiativeBodyOneStatusReportsMax).optional(),
5828
+ "dependsOn": arrayType(stringType()).max(createInitiativeBodyOneDependsOnMax),
5342
5829
  "requiredSkills": arrayType(objectType({
5343
5830
  "skillId": stringType(),
5344
- "fte": numberType()
5345
- })).optional(),
5831
+ "fte": numberType(),
5832
+ "runFte": numberType().min(createInitiativeBodyOneRequiredSkillsItemRunFteMin).optional()
5833
+ })).max(createInitiativeBodyOneRequiredSkillsMax).optional(),
5834
+ "capabilityImpacts": arrayType(objectType({
5835
+ "capabilityId": stringType(),
5836
+ "kind": enumType(["improve", "new", "replace", "retire"]),
5837
+ "maturityTo": numberType().min(1).max(createInitiativeBodyOneCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
5838
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(createInitiativeBodyOneCapabilityImpactsMax).optional(),
5346
5839
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
5347
5840
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
5348
5841
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
5349
- "dpiaUrl": stringType().optional(),
5842
+ "dpiaUrl": stringType().max(createInitiativeBodyOneDpiaUrlMax).optional(),
5350
5843
  "modelCardStatus": enumType(["Not Required", "Draft", "Published"]).optional(),
5351
- "modelCardUrl": stringType().optional(),
5352
- "prohibitedOverride": stringType().optional(),
5844
+ "modelCardUrl": stringType().max(createInitiativeBodyOneModelCardUrlMax).optional(),
5845
+ "prohibitedOverride": stringType().max(createInitiativeBodyOneProhibitedOverrideMax).optional(),
5353
5846
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
5354
5847
  "checked": booleanType(),
5355
5848
  "asOfDate": stringType().optional(),
5356
- "note": stringType().optional()
5849
+ "note": stringType().max(createInitiativeBodyOneGateEvidenceNoteMax).optional(),
5850
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
5851
+ "checkedBy": objectType({
5852
+ "userId": stringType().uuid(),
5853
+ "name": stringType()
5854
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who ticked it. Ignored in requests.")
5357
5855
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
5358
5856
  "gateBypassed": booleanType().optional(),
5359
5857
  "aiAct": objectType({
@@ -5369,28 +5867,28 @@ var CreateInitiativeBody = objectType({
5369
5867
  "integratesThirdPartyGpai": booleanType().optional(),
5370
5868
  "upstreamGpaiProvider": stringType().optional(),
5371
5869
  "upstreamGpaiInfoAvailable": booleanType().optional(),
5372
- "prohibitedPractices": arrayType(stringType()),
5373
- "art50Flags": arrayType(stringType()),
5870
+ "prohibitedPractices": arrayType(stringType().max(createInitiativeBodyOneAiActProhibitedPracticesItemMax)).max(createInitiativeBodyOneAiActProhibitedPracticesMax),
5871
+ "art50Flags": arrayType(stringType().max(createInitiativeBodyOneAiActArt50FlagsItemMax)).max(createInitiativeBodyOneAiActArt50FlagsMax),
5374
5872
  "publicSector": booleanType().optional(),
5375
5873
  "establishedOutsideEU": booleanType().optional(),
5376
- "classificationRationale": stringType().optional(),
5874
+ "classificationRationale": stringType().max(createInitiativeBodyOneAiActClassificationRationaleMax).optional(),
5377
5875
  "classificationConfirmed": booleanType().optional(),
5378
5876
  "classificationConfirmedBy": stringType().optional(),
5379
5877
  "classificationConfirmedAt": stringType().optional(),
5380
5878
  "artifacts": recordType(stringType(), objectType({
5381
5879
  "status": enumType(["Not started", "Draft", "In Review", "Approved", "Outdated"]),
5382
- "owner": stringType().optional(),
5880
+ "owner": stringType().max(createInitiativeBodyOneAiActArtifactsOwnerMax).optional(),
5383
5881
  "lastReviewedAt": stringType().optional(),
5384
- "link": stringType().optional(),
5385
- "note": stringType().optional(),
5882
+ "link": stringType().max(createInitiativeBodyOneAiActArtifactsLinkMax).optional(),
5883
+ "note": stringType().max(createInitiativeBodyOneAiActArtifactsNoteMax).optional(),
5386
5884
  "maxAgeDays": numberType().optional()
5387
5885
  })).optional(),
5388
5886
  "obligations": recordType(stringType(), objectType({
5389
5887
  "status": enumType(["Not started", "In Progress", "Done", "N/A"]),
5390
- "owner": stringType().optional(),
5888
+ "owner": stringType().max(createInitiativeBodyOneAiActObligationsOwnerMax).optional(),
5391
5889
  "dueDate": stringType().optional(),
5392
- "evidenceLink": stringType().optional(),
5393
- "approver": stringType().optional(),
5890
+ "evidenceLink": stringType().max(createInitiativeBodyOneAiActObligationsEvidenceLinkMax).optional(),
5891
+ "approver": stringType().max(createInitiativeBodyOneAiActObligationsApproverMax).optional(),
5394
5892
  "approvalDate": stringType().optional(),
5395
5893
  "reviewDate": stringType().optional()
5396
5894
  })).optional(),
@@ -5417,16 +5915,16 @@ var CreateInitiativeBody = objectType({
5417
5915
  "occurredAt": stringType(),
5418
5916
  "detectedAt": stringType(),
5419
5917
  "category": enumType(["general", "death-or-serious-damage", "cybersecurity", "fundamental-rights", "infrastructure-disruption"]),
5420
- "description": stringType(),
5918
+ "description": stringType().max(createInitiativeBodyOneAiActIncidentsItemDescriptionMax),
5421
5919
  "status": enumType(["open", "reported", "closed"]),
5422
- "authorityRef": stringType().optional(),
5423
- "owner": stringType().optional(),
5424
- "rootCause": stringType().optional(),
5425
- "correctiveActions": stringType().optional(),
5920
+ "authorityRef": stringType().max(createInitiativeBodyOneAiActIncidentsItemAuthorityRefMax).optional(),
5921
+ "owner": stringType().max(createInitiativeBodyOneAiActIncidentsItemOwnerMax).optional(),
5922
+ "rootCause": stringType().max(createInitiativeBodyOneAiActIncidentsItemRootCauseMax).optional(),
5923
+ "correctiveActions": stringType().max(createInitiativeBodyOneAiActIncidentsItemCorrectiveActionsMax).optional(),
5426
5924
  "reportedAt": stringType().optional(),
5427
5925
  "createdAt": stringType(),
5428
5926
  "updatedAt": stringType()
5429
- })).optional()
5927
+ })).max(createInitiativeBodyOneAiActIncidentsMax).optional()
5430
5928
  }).optional(),
5431
5929
  "createdBy": objectType({
5432
5930
  "userId": stringType().uuid(),
@@ -5436,6 +5934,7 @@ var CreateInitiativeBody = objectType({
5436
5934
  "userId": stringType().uuid(),
5437
5935
  "name": stringType()
5438
5936
  }).optional().describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body."),
5937
+ "version": numberType().min(1).optional().describe("Save counter, raised by the server on every save. A request names the version its edit is based on in InitiativeInput.baseVersion; this field is ignored in requests."),
5439
5938
  "createdAt": stringType(),
5440
5939
  "updatedAt": stringType()
5441
5940
  }).and(objectType({
@@ -5443,18 +5942,66 @@ var CreateInitiativeBody = objectType({
5443
5942
  "createdBy": unknownType().optional(),
5444
5943
  "updatedBy": unknownType().optional(),
5445
5944
  "createdAt": unknownType().optional(),
5446
- "updatedAt": unknownType().optional()
5945
+ "updatedAt": unknownType().optional(),
5946
+ "version": unknownType().optional(),
5947
+ "baseVersion": numberType().min(1).optional().describe("PUT only: the version the edit is based on. When it differs from the stored version, someone else saved in between and the save is refused with 409 and the current copy. Omitted (clients that predate it), the save is not checked. A separate field, not `version`, because older clients echo every field they received, including `version`, without ever updating it.")
5447
5948
  })).describe("Same as Initiative, minus server-assigned fields.");
5448
5949
  var GetInitiativeParams = objectType({
5449
5950
  "id": coerce.string().uuid()
5450
5951
  });
5952
+ var getInitiativeResponseNameMax = 200;
5953
+ var getInitiativeResponseExternalIdMax = 200;
5954
+ var getInitiativeResponseBusinessUnitMax = 200;
5955
+ var getInitiativeResponseOwnerMax = 200;
5956
+ var getInitiativeResponseDescriptionMax = 1e4;
5957
+ var getInitiativeResponseAiCategoryMax = 200;
5958
+ var getInitiativeResponseTagsItemMax = 200;
5959
+ var getInitiativeResponseTagsMax = 1e3;
5960
+ var getInitiativeResponseDocsUrlMax = 2e3;
5961
+ var getInitiativeResponsePmUrlMax = 2e3;
5962
+ var getInitiativeResponseDecisionLogItemOwnerMax = 200;
5963
+ var getInitiativeResponseDecisionLogItemRationaleMax = 1e4;
5964
+ var getInitiativeResponseDecisionLogMax = 1e3;
5965
+ var getInitiativeResponseStatusReportsItemAuthorMax = 200;
5966
+ var getInitiativeResponseStatusReportsItemScopeCommentMax = 1e4;
5967
+ var getInitiativeResponseStatusReportsItemTimelineCommentMax = 1e4;
5968
+ var getInitiativeResponseStatusReportsItemBudgetCommentMax = 1e4;
5969
+ var getInitiativeResponseStatusReportsItemSkillsCommentMax = 1e4;
5970
+ var getInitiativeResponseStatusReportsItemSummaryMax = 1e4;
5971
+ var getInitiativeResponseStatusReportsMax = 1e3;
5972
+ var getInitiativeResponseDependsOnMax = 1e3;
5973
+ var getInitiativeResponseRequiredSkillsItemRunFteMin = 0;
5974
+ var getInitiativeResponseRequiredSkillsMax = 1e3;
5975
+ var getInitiativeResponseCapabilityImpactsItemMaturityToMax = 5;
5976
+ var getInitiativeResponseCapabilityImpactsMax = 1e3;
5977
+ var getInitiativeResponseDpiaUrlMax = 2e3;
5978
+ var getInitiativeResponseModelCardUrlMax = 2e3;
5979
+ var getInitiativeResponseProhibitedOverrideMax = 2e3;
5980
+ var getInitiativeResponseGateEvidenceNoteMax = 1e4;
5981
+ var getInitiativeResponseAiActProhibitedPracticesItemMax = 200;
5982
+ var getInitiativeResponseAiActProhibitedPracticesMax = 100;
5983
+ var getInitiativeResponseAiActArt50FlagsItemMax = 200;
5984
+ var getInitiativeResponseAiActArt50FlagsMax = 100;
5985
+ var getInitiativeResponseAiActClassificationRationaleMax = 1e4;
5986
+ var getInitiativeResponseAiActArtifactsOwnerMax = 200;
5987
+ var getInitiativeResponseAiActArtifactsLinkMax = 2e3;
5988
+ var getInitiativeResponseAiActArtifactsNoteMax = 1e4;
5989
+ var getInitiativeResponseAiActObligationsOwnerMax = 200;
5990
+ var getInitiativeResponseAiActObligationsEvidenceLinkMax = 2e3;
5991
+ var getInitiativeResponseAiActObligationsApproverMax = 200;
5992
+ var getInitiativeResponseAiActIncidentsItemDescriptionMax = 1e4;
5993
+ var getInitiativeResponseAiActIncidentsItemAuthorityRefMax = 2e3;
5994
+ var getInitiativeResponseAiActIncidentsItemOwnerMax = 200;
5995
+ var getInitiativeResponseAiActIncidentsItemRootCauseMax = 1e4;
5996
+ var getInitiativeResponseAiActIncidentsItemCorrectiveActionsMax = 1e4;
5997
+ var getInitiativeResponseAiActIncidentsMax = 1e3;
5451
5998
  var GetInitiativeResponse = objectType({
5452
5999
  "id": stringType(),
5453
- "name": stringType(),
5454
- "externalId": stringType().optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
5455
- "businessUnit": stringType(),
5456
- "owner": stringType(),
5457
- "description": stringType(),
6000
+ "name": stringType().max(getInitiativeResponseNameMax),
6001
+ "externalId": stringType().max(getInitiativeResponseExternalIdMax).optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
6002
+ "businessUnit": stringType().max(getInitiativeResponseBusinessUnitMax),
6003
+ "owner": stringType().max(getInitiativeResponseOwnerMax),
6004
+ "description": stringType().max(getInitiativeResponseDescriptionMax),
5458
6005
  "status": enumType(["Idea", "Pilot", "Scaling", "In Production", "On Hold", "Retired"]),
5459
6006
  "timelineStart": stringType(),
5460
6007
  "timelineEnd": stringType(),
@@ -5462,15 +6009,20 @@ var GetInitiativeResponse = objectType({
5462
6009
  "budgetForwardLooking": numberType().optional(),
5463
6010
  "vendorDependency": enumType(["None", "Single Vendor", "Multi-Vendor", "Internal Build", "Hybrid"]),
5464
6011
  "solutionType": enumType(["Internal", "External", "Hybrid"]),
5465
- "aiCategory": stringType(),
5466
- "tags": arrayType(stringType()),
5467
- "docsUrl": stringType().optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
5468
- "pmUrl": stringType().optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
6012
+ "aiCategory": stringType().max(getInitiativeResponseAiCategoryMax),
6013
+ "tags": arrayType(stringType().max(getInitiativeResponseTagsItemMax)).max(getInitiativeResponseTagsMax),
6014
+ "docsUrl": stringType().max(getInitiativeResponseDocsUrlMax).optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
6015
+ "pmUrl": stringType().max(getInitiativeResponsePmUrlMax).optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
5469
6016
  "archived": booleanType(),
5470
6017
  "evaluation": objectType({
5471
6018
  "valueScale": objectType({
5472
6019
  "score": numberType(),
5473
- "confidence": enumType(["Low", "Medium", "High"])
6020
+ "confidence": enumType(["Low", "Medium", "High"]),
6021
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6022
+ "scoredBy": objectType({
6023
+ "userId": stringType().uuid(),
6024
+ "name": stringType()
6025
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5474
6026
  }).and(objectType({
5475
6027
  "subs": objectType({
5476
6028
  "frequencyOfProcess": numberType(),
@@ -5484,7 +6036,12 @@ var GetInitiativeResponse = objectType({
5484
6036
  })),
5485
6037
  "feasibility": objectType({
5486
6038
  "score": numberType(),
5487
- "confidence": enumType(["Low", "Medium", "High"])
6039
+ "confidence": enumType(["Low", "Medium", "High"]),
6040
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6041
+ "scoredBy": objectType({
6042
+ "userId": stringType().uuid(),
6043
+ "name": stringType()
6044
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5488
6045
  }).and(objectType({
5489
6046
  "subs": objectType({
5490
6047
  "dataAvailability": numberType(),
@@ -5498,7 +6055,12 @@ var GetInitiativeResponse = objectType({
5498
6055
  })),
5499
6056
  "governance": objectType({
5500
6057
  "score": numberType(),
5501
- "confidence": enumType(["Low", "Medium", "High"])
6058
+ "confidence": enumType(["Low", "Medium", "High"]),
6059
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6060
+ "scoredBy": objectType({
6061
+ "userId": stringType().uuid(),
6062
+ "name": stringType()
6063
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5502
6064
  }).and(objectType({
5503
6065
  "subs": objectType({
5504
6066
  "regulatoryExposure": numberType(),
@@ -5513,7 +6075,12 @@ var GetInitiativeResponse = objectType({
5513
6075
  })),
5514
6076
  "strategic": objectType({
5515
6077
  "score": numberType(),
5516
- "confidence": enumType(["Low", "Medium", "High"])
6078
+ "confidence": enumType(["Low", "Medium", "High"]),
6079
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6080
+ "scoredBy": objectType({
6081
+ "userId": stringType().uuid(),
6082
+ "name": stringType()
6083
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5517
6084
  }).and(objectType({
5518
6085
  "subs": objectType({
5519
6086
  "strategicDifferentiation": numberType(),
@@ -5545,7 +6112,8 @@ var GetInitiativeResponse = objectType({
5545
6112
  "y1Pct": numberType(),
5546
6113
  "y2Pct": numberType()
5547
6114
  }).optional(),
5548
- "discountRatePct": numberType().optional()
6115
+ "discountRatePct": numberType().optional(),
6116
+ "operatingCostAnnual": numberType().optional()
5549
6117
  }).optional(),
5550
6118
  "actuals": objectType({
5551
6119
  "operatingCostAnnual": numberType().optional(),
@@ -5565,48 +6133,64 @@ var GetInitiativeResponse = objectType({
5565
6133
  "id": stringType(),
5566
6134
  "date": stringType(),
5567
6135
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
5568
- "owner": stringType().optional(),
5569
- "rationale": stringType().optional(),
5570
- "createdAt": stringType().optional()
5571
- })).optional(),
6136
+ "owner": stringType().max(getInitiativeResponseDecisionLogItemOwnerMax).optional(),
6137
+ "rationale": stringType().max(getInitiativeResponseDecisionLogItemRationaleMax).optional(),
6138
+ "createdAt": stringType().optional(),
6139
+ "recordedAt": stringType().optional().describe("Server stamp: when the entry was recorded or its content last changed (`date` is when the decision was taken). Absent on entries not saved since the stamps were introduced. Ignored in requests."),
6140
+ "recordedBy": objectType({
6141
+ "userId": stringType().uuid(),
6142
+ "name": stringType()
6143
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who recorded it. Ignored in requests.")
6144
+ })).max(getInitiativeResponseDecisionLogMax).optional(),
5572
6145
  "statusReports": arrayType(objectType({
5573
6146
  "id": stringType(),
5574
6147
  "date": stringType(),
5575
- "author": stringType().optional(),
6148
+ "author": stringType().max(getInitiativeResponseStatusReportsItemAuthorMax).optional(),
5576
6149
  "scope": objectType({
5577
6150
  "rag": enumType(["green", "yellow", "red"]),
5578
- "comment": stringType().optional()
6151
+ "comment": stringType().max(getInitiativeResponseStatusReportsItemScopeCommentMax).optional()
5579
6152
  }),
5580
6153
  "timeline": objectType({
5581
6154
  "rag": enumType(["green", "yellow", "red"]),
5582
- "comment": stringType().optional()
6155
+ "comment": stringType().max(getInitiativeResponseStatusReportsItemTimelineCommentMax).optional()
5583
6156
  }),
5584
6157
  "budget": objectType({
5585
6158
  "rag": enumType(["green", "yellow", "red"]),
5586
- "comment": stringType().optional()
6159
+ "comment": stringType().max(getInitiativeResponseStatusReportsItemBudgetCommentMax).optional()
5587
6160
  }),
5588
6161
  "skills": objectType({
5589
6162
  "rag": enumType(["green", "yellow", "red"]),
5590
- "comment": stringType().optional()
6163
+ "comment": stringType().max(getInitiativeResponseStatusReportsItemSkillsCommentMax).optional()
5591
6164
  }),
5592
- "summary": stringType().optional()
5593
- })).optional(),
5594
- "dependsOn": arrayType(stringType()),
6165
+ "summary": stringType().max(getInitiativeResponseStatusReportsItemSummaryMax).optional()
6166
+ })).max(getInitiativeResponseStatusReportsMax).optional(),
6167
+ "dependsOn": arrayType(stringType()).max(getInitiativeResponseDependsOnMax),
5595
6168
  "requiredSkills": arrayType(objectType({
5596
6169
  "skillId": stringType(),
5597
- "fte": numberType()
5598
- })).optional(),
6170
+ "fte": numberType(),
6171
+ "runFte": numberType().min(getInitiativeResponseRequiredSkillsItemRunFteMin).optional()
6172
+ })).max(getInitiativeResponseRequiredSkillsMax).optional(),
6173
+ "capabilityImpacts": arrayType(objectType({
6174
+ "capabilityId": stringType(),
6175
+ "kind": enumType(["improve", "new", "replace", "retire"]),
6176
+ "maturityTo": numberType().min(1).max(getInitiativeResponseCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
6177
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(getInitiativeResponseCapabilityImpactsMax).optional(),
5599
6178
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
5600
6179
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
5601
6180
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
5602
- "dpiaUrl": stringType().optional(),
6181
+ "dpiaUrl": stringType().max(getInitiativeResponseDpiaUrlMax).optional(),
5603
6182
  "modelCardStatus": enumType(["Not Required", "Draft", "Published"]).optional(),
5604
- "modelCardUrl": stringType().optional(),
5605
- "prohibitedOverride": stringType().optional(),
6183
+ "modelCardUrl": stringType().max(getInitiativeResponseModelCardUrlMax).optional(),
6184
+ "prohibitedOverride": stringType().max(getInitiativeResponseProhibitedOverrideMax).optional(),
5606
6185
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
5607
6186
  "checked": booleanType(),
5608
6187
  "asOfDate": stringType().optional(),
5609
- "note": stringType().optional()
6188
+ "note": stringType().max(getInitiativeResponseGateEvidenceNoteMax).optional(),
6189
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
6190
+ "checkedBy": objectType({
6191
+ "userId": stringType().uuid(),
6192
+ "name": stringType()
6193
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who ticked it. Ignored in requests.")
5610
6194
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
5611
6195
  "gateBypassed": booleanType().optional(),
5612
6196
  "aiAct": objectType({
@@ -5622,28 +6206,28 @@ var GetInitiativeResponse = objectType({
5622
6206
  "integratesThirdPartyGpai": booleanType().optional(),
5623
6207
  "upstreamGpaiProvider": stringType().optional(),
5624
6208
  "upstreamGpaiInfoAvailable": booleanType().optional(),
5625
- "prohibitedPractices": arrayType(stringType()),
5626
- "art50Flags": arrayType(stringType()),
6209
+ "prohibitedPractices": arrayType(stringType().max(getInitiativeResponseAiActProhibitedPracticesItemMax)).max(getInitiativeResponseAiActProhibitedPracticesMax),
6210
+ "art50Flags": arrayType(stringType().max(getInitiativeResponseAiActArt50FlagsItemMax)).max(getInitiativeResponseAiActArt50FlagsMax),
5627
6211
  "publicSector": booleanType().optional(),
5628
6212
  "establishedOutsideEU": booleanType().optional(),
5629
- "classificationRationale": stringType().optional(),
6213
+ "classificationRationale": stringType().max(getInitiativeResponseAiActClassificationRationaleMax).optional(),
5630
6214
  "classificationConfirmed": booleanType().optional(),
5631
6215
  "classificationConfirmedBy": stringType().optional(),
5632
6216
  "classificationConfirmedAt": stringType().optional(),
5633
6217
  "artifacts": recordType(stringType(), objectType({
5634
6218
  "status": enumType(["Not started", "Draft", "In Review", "Approved", "Outdated"]),
5635
- "owner": stringType().optional(),
6219
+ "owner": stringType().max(getInitiativeResponseAiActArtifactsOwnerMax).optional(),
5636
6220
  "lastReviewedAt": stringType().optional(),
5637
- "link": stringType().optional(),
5638
- "note": stringType().optional(),
6221
+ "link": stringType().max(getInitiativeResponseAiActArtifactsLinkMax).optional(),
6222
+ "note": stringType().max(getInitiativeResponseAiActArtifactsNoteMax).optional(),
5639
6223
  "maxAgeDays": numberType().optional()
5640
6224
  })).optional(),
5641
6225
  "obligations": recordType(stringType(), objectType({
5642
6226
  "status": enumType(["Not started", "In Progress", "Done", "N/A"]),
5643
- "owner": stringType().optional(),
6227
+ "owner": stringType().max(getInitiativeResponseAiActObligationsOwnerMax).optional(),
5644
6228
  "dueDate": stringType().optional(),
5645
- "evidenceLink": stringType().optional(),
5646
- "approver": stringType().optional(),
6229
+ "evidenceLink": stringType().max(getInitiativeResponseAiActObligationsEvidenceLinkMax).optional(),
6230
+ "approver": stringType().max(getInitiativeResponseAiActObligationsApproverMax).optional(),
5647
6231
  "approvalDate": stringType().optional(),
5648
6232
  "reviewDate": stringType().optional()
5649
6233
  })).optional(),
@@ -5670,16 +6254,16 @@ var GetInitiativeResponse = objectType({
5670
6254
  "occurredAt": stringType(),
5671
6255
  "detectedAt": stringType(),
5672
6256
  "category": enumType(["general", "death-or-serious-damage", "cybersecurity", "fundamental-rights", "infrastructure-disruption"]),
5673
- "description": stringType(),
6257
+ "description": stringType().max(getInitiativeResponseAiActIncidentsItemDescriptionMax),
5674
6258
  "status": enumType(["open", "reported", "closed"]),
5675
- "authorityRef": stringType().optional(),
5676
- "owner": stringType().optional(),
5677
- "rootCause": stringType().optional(),
5678
- "correctiveActions": stringType().optional(),
6259
+ "authorityRef": stringType().max(getInitiativeResponseAiActIncidentsItemAuthorityRefMax).optional(),
6260
+ "owner": stringType().max(getInitiativeResponseAiActIncidentsItemOwnerMax).optional(),
6261
+ "rootCause": stringType().max(getInitiativeResponseAiActIncidentsItemRootCauseMax).optional(),
6262
+ "correctiveActions": stringType().max(getInitiativeResponseAiActIncidentsItemCorrectiveActionsMax).optional(),
5679
6263
  "reportedAt": stringType().optional(),
5680
6264
  "createdAt": stringType(),
5681
6265
  "updatedAt": stringType()
5682
- })).optional()
6266
+ })).max(getInitiativeResponseAiActIncidentsMax).optional()
5683
6267
  }).optional(),
5684
6268
  "createdBy": objectType({
5685
6269
  "userId": stringType().uuid(),
@@ -5689,19 +6273,66 @@ var GetInitiativeResponse = objectType({
5689
6273
  "userId": stringType().uuid(),
5690
6274
  "name": stringType()
5691
6275
  }).optional().describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body."),
6276
+ "version": numberType().min(1).optional().describe("Save counter, raised by the server on every save. A request names the version its edit is based on in InitiativeInput.baseVersion; this field is ignored in requests."),
5692
6277
  "createdAt": stringType(),
5693
6278
  "updatedAt": stringType()
5694
6279
  });
5695
6280
  var UpdateInitiativeParams = objectType({
5696
6281
  "id": coerce.string().uuid()
5697
6282
  });
6283
+ var updateInitiativeBodyOneNameMax = 200;
6284
+ var updateInitiativeBodyOneExternalIdMax = 200;
6285
+ var updateInitiativeBodyOneBusinessUnitMax = 200;
6286
+ var updateInitiativeBodyOneOwnerMax = 200;
6287
+ var updateInitiativeBodyOneDescriptionMax = 1e4;
6288
+ var updateInitiativeBodyOneAiCategoryMax = 200;
6289
+ var updateInitiativeBodyOneTagsItemMax = 200;
6290
+ var updateInitiativeBodyOneTagsMax = 1e3;
6291
+ var updateInitiativeBodyOneDocsUrlMax = 2e3;
6292
+ var updateInitiativeBodyOnePmUrlMax = 2e3;
6293
+ var updateInitiativeBodyOneDecisionLogItemOwnerMax = 200;
6294
+ var updateInitiativeBodyOneDecisionLogItemRationaleMax = 1e4;
6295
+ var updateInitiativeBodyOneDecisionLogMax = 1e3;
6296
+ var updateInitiativeBodyOneStatusReportsItemAuthorMax = 200;
6297
+ var updateInitiativeBodyOneStatusReportsItemScopeCommentMax = 1e4;
6298
+ var updateInitiativeBodyOneStatusReportsItemTimelineCommentMax = 1e4;
6299
+ var updateInitiativeBodyOneStatusReportsItemBudgetCommentMax = 1e4;
6300
+ var updateInitiativeBodyOneStatusReportsItemSkillsCommentMax = 1e4;
6301
+ var updateInitiativeBodyOneStatusReportsItemSummaryMax = 1e4;
6302
+ var updateInitiativeBodyOneStatusReportsMax = 1e3;
6303
+ var updateInitiativeBodyOneDependsOnMax = 1e3;
6304
+ var updateInitiativeBodyOneRequiredSkillsItemRunFteMin = 0;
6305
+ var updateInitiativeBodyOneRequiredSkillsMax = 1e3;
6306
+ var updateInitiativeBodyOneCapabilityImpactsItemMaturityToMax = 5;
6307
+ var updateInitiativeBodyOneCapabilityImpactsMax = 1e3;
6308
+ var updateInitiativeBodyOneDpiaUrlMax = 2e3;
6309
+ var updateInitiativeBodyOneModelCardUrlMax = 2e3;
6310
+ var updateInitiativeBodyOneProhibitedOverrideMax = 2e3;
6311
+ var updateInitiativeBodyOneGateEvidenceNoteMax = 1e4;
6312
+ var updateInitiativeBodyOneAiActProhibitedPracticesItemMax = 200;
6313
+ var updateInitiativeBodyOneAiActProhibitedPracticesMax = 100;
6314
+ var updateInitiativeBodyOneAiActArt50FlagsItemMax = 200;
6315
+ var updateInitiativeBodyOneAiActArt50FlagsMax = 100;
6316
+ var updateInitiativeBodyOneAiActClassificationRationaleMax = 1e4;
6317
+ var updateInitiativeBodyOneAiActArtifactsOwnerMax = 200;
6318
+ var updateInitiativeBodyOneAiActArtifactsLinkMax = 2e3;
6319
+ var updateInitiativeBodyOneAiActArtifactsNoteMax = 1e4;
6320
+ var updateInitiativeBodyOneAiActObligationsOwnerMax = 200;
6321
+ var updateInitiativeBodyOneAiActObligationsEvidenceLinkMax = 2e3;
6322
+ var updateInitiativeBodyOneAiActObligationsApproverMax = 200;
6323
+ var updateInitiativeBodyOneAiActIncidentsItemDescriptionMax = 1e4;
6324
+ var updateInitiativeBodyOneAiActIncidentsItemAuthorityRefMax = 2e3;
6325
+ var updateInitiativeBodyOneAiActIncidentsItemOwnerMax = 200;
6326
+ var updateInitiativeBodyOneAiActIncidentsItemRootCauseMax = 1e4;
6327
+ var updateInitiativeBodyOneAiActIncidentsItemCorrectiveActionsMax = 1e4;
6328
+ var updateInitiativeBodyOneAiActIncidentsMax = 1e3;
5698
6329
  var UpdateInitiativeBody = objectType({
5699
6330
  "id": stringType(),
5700
- "name": stringType(),
5701
- "externalId": stringType().optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
5702
- "businessUnit": stringType(),
5703
- "owner": stringType(),
5704
- "description": stringType(),
6331
+ "name": stringType().max(updateInitiativeBodyOneNameMax),
6332
+ "externalId": stringType().max(updateInitiativeBodyOneExternalIdMax).optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
6333
+ "businessUnit": stringType().max(updateInitiativeBodyOneBusinessUnitMax),
6334
+ "owner": stringType().max(updateInitiativeBodyOneOwnerMax),
6335
+ "description": stringType().max(updateInitiativeBodyOneDescriptionMax),
5705
6336
  "status": enumType(["Idea", "Pilot", "Scaling", "In Production", "On Hold", "Retired"]),
5706
6337
  "timelineStart": stringType(),
5707
6338
  "timelineEnd": stringType(),
@@ -5709,15 +6340,20 @@ var UpdateInitiativeBody = objectType({
5709
6340
  "budgetForwardLooking": numberType().optional(),
5710
6341
  "vendorDependency": enumType(["None", "Single Vendor", "Multi-Vendor", "Internal Build", "Hybrid"]),
5711
6342
  "solutionType": enumType(["Internal", "External", "Hybrid"]),
5712
- "aiCategory": stringType(),
5713
- "tags": arrayType(stringType()),
5714
- "docsUrl": stringType().optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
5715
- "pmUrl": stringType().optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
6343
+ "aiCategory": stringType().max(updateInitiativeBodyOneAiCategoryMax),
6344
+ "tags": arrayType(stringType().max(updateInitiativeBodyOneTagsItemMax)).max(updateInitiativeBodyOneTagsMax),
6345
+ "docsUrl": stringType().max(updateInitiativeBodyOneDocsUrlMax).optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
6346
+ "pmUrl": stringType().max(updateInitiativeBodyOnePmUrlMax).optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
5716
6347
  "archived": booleanType(),
5717
6348
  "evaluation": objectType({
5718
6349
  "valueScale": objectType({
5719
6350
  "score": numberType(),
5720
- "confidence": enumType(["Low", "Medium", "High"])
6351
+ "confidence": enumType(["Low", "Medium", "High"]),
6352
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6353
+ "scoredBy": objectType({
6354
+ "userId": stringType().uuid(),
6355
+ "name": stringType()
6356
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5721
6357
  }).and(objectType({
5722
6358
  "subs": objectType({
5723
6359
  "frequencyOfProcess": numberType(),
@@ -5731,7 +6367,12 @@ var UpdateInitiativeBody = objectType({
5731
6367
  })),
5732
6368
  "feasibility": objectType({
5733
6369
  "score": numberType(),
5734
- "confidence": enumType(["Low", "Medium", "High"])
6370
+ "confidence": enumType(["Low", "Medium", "High"]),
6371
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6372
+ "scoredBy": objectType({
6373
+ "userId": stringType().uuid(),
6374
+ "name": stringType()
6375
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5735
6376
  }).and(objectType({
5736
6377
  "subs": objectType({
5737
6378
  "dataAvailability": numberType(),
@@ -5745,7 +6386,12 @@ var UpdateInitiativeBody = objectType({
5745
6386
  })),
5746
6387
  "governance": objectType({
5747
6388
  "score": numberType(),
5748
- "confidence": enumType(["Low", "Medium", "High"])
6389
+ "confidence": enumType(["Low", "Medium", "High"]),
6390
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6391
+ "scoredBy": objectType({
6392
+ "userId": stringType().uuid(),
6393
+ "name": stringType()
6394
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5749
6395
  }).and(objectType({
5750
6396
  "subs": objectType({
5751
6397
  "regulatoryExposure": numberType(),
@@ -5760,7 +6406,12 @@ var UpdateInitiativeBody = objectType({
5760
6406
  })),
5761
6407
  "strategic": objectType({
5762
6408
  "score": numberType(),
5763
- "confidence": enumType(["Low", "Medium", "High"])
6409
+ "confidence": enumType(["Low", "Medium", "High"]),
6410
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6411
+ "scoredBy": objectType({
6412
+ "userId": stringType().uuid(),
6413
+ "name": stringType()
6414
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5764
6415
  }).and(objectType({
5765
6416
  "subs": objectType({
5766
6417
  "strategicDifferentiation": numberType(),
@@ -5792,7 +6443,8 @@ var UpdateInitiativeBody = objectType({
5792
6443
  "y1Pct": numberType(),
5793
6444
  "y2Pct": numberType()
5794
6445
  }).optional(),
5795
- "discountRatePct": numberType().optional()
6446
+ "discountRatePct": numberType().optional(),
6447
+ "operatingCostAnnual": numberType().optional()
5796
6448
  }).optional(),
5797
6449
  "actuals": objectType({
5798
6450
  "operatingCostAnnual": numberType().optional(),
@@ -5812,48 +6464,64 @@ var UpdateInitiativeBody = objectType({
5812
6464
  "id": stringType(),
5813
6465
  "date": stringType(),
5814
6466
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
5815
- "owner": stringType().optional(),
5816
- "rationale": stringType().optional(),
5817
- "createdAt": stringType().optional()
5818
- })).optional(),
6467
+ "owner": stringType().max(updateInitiativeBodyOneDecisionLogItemOwnerMax).optional(),
6468
+ "rationale": stringType().max(updateInitiativeBodyOneDecisionLogItemRationaleMax).optional(),
6469
+ "createdAt": stringType().optional(),
6470
+ "recordedAt": stringType().optional().describe("Server stamp: when the entry was recorded or its content last changed (`date` is when the decision was taken). Absent on entries not saved since the stamps were introduced. Ignored in requests."),
6471
+ "recordedBy": objectType({
6472
+ "userId": stringType().uuid(),
6473
+ "name": stringType()
6474
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who recorded it. Ignored in requests.")
6475
+ })).max(updateInitiativeBodyOneDecisionLogMax).optional(),
5819
6476
  "statusReports": arrayType(objectType({
5820
6477
  "id": stringType(),
5821
6478
  "date": stringType(),
5822
- "author": stringType().optional(),
6479
+ "author": stringType().max(updateInitiativeBodyOneStatusReportsItemAuthorMax).optional(),
5823
6480
  "scope": objectType({
5824
6481
  "rag": enumType(["green", "yellow", "red"]),
5825
- "comment": stringType().optional()
6482
+ "comment": stringType().max(updateInitiativeBodyOneStatusReportsItemScopeCommentMax).optional()
5826
6483
  }),
5827
6484
  "timeline": objectType({
5828
6485
  "rag": enumType(["green", "yellow", "red"]),
5829
- "comment": stringType().optional()
6486
+ "comment": stringType().max(updateInitiativeBodyOneStatusReportsItemTimelineCommentMax).optional()
5830
6487
  }),
5831
6488
  "budget": objectType({
5832
6489
  "rag": enumType(["green", "yellow", "red"]),
5833
- "comment": stringType().optional()
6490
+ "comment": stringType().max(updateInitiativeBodyOneStatusReportsItemBudgetCommentMax).optional()
5834
6491
  }),
5835
6492
  "skills": objectType({
5836
6493
  "rag": enumType(["green", "yellow", "red"]),
5837
- "comment": stringType().optional()
6494
+ "comment": stringType().max(updateInitiativeBodyOneStatusReportsItemSkillsCommentMax).optional()
5838
6495
  }),
5839
- "summary": stringType().optional()
5840
- })).optional(),
5841
- "dependsOn": arrayType(stringType()),
6496
+ "summary": stringType().max(updateInitiativeBodyOneStatusReportsItemSummaryMax).optional()
6497
+ })).max(updateInitiativeBodyOneStatusReportsMax).optional(),
6498
+ "dependsOn": arrayType(stringType()).max(updateInitiativeBodyOneDependsOnMax),
5842
6499
  "requiredSkills": arrayType(objectType({
5843
6500
  "skillId": stringType(),
5844
- "fte": numberType()
5845
- })).optional(),
6501
+ "fte": numberType(),
6502
+ "runFte": numberType().min(updateInitiativeBodyOneRequiredSkillsItemRunFteMin).optional()
6503
+ })).max(updateInitiativeBodyOneRequiredSkillsMax).optional(),
6504
+ "capabilityImpacts": arrayType(objectType({
6505
+ "capabilityId": stringType(),
6506
+ "kind": enumType(["improve", "new", "replace", "retire"]),
6507
+ "maturityTo": numberType().min(1).max(updateInitiativeBodyOneCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
6508
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(updateInitiativeBodyOneCapabilityImpactsMax).optional(),
5846
6509
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
5847
6510
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
5848
6511
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
5849
- "dpiaUrl": stringType().optional(),
6512
+ "dpiaUrl": stringType().max(updateInitiativeBodyOneDpiaUrlMax).optional(),
5850
6513
  "modelCardStatus": enumType(["Not Required", "Draft", "Published"]).optional(),
5851
- "modelCardUrl": stringType().optional(),
5852
- "prohibitedOverride": stringType().optional(),
6514
+ "modelCardUrl": stringType().max(updateInitiativeBodyOneModelCardUrlMax).optional(),
6515
+ "prohibitedOverride": stringType().max(updateInitiativeBodyOneProhibitedOverrideMax).optional(),
5853
6516
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
5854
6517
  "checked": booleanType(),
5855
6518
  "asOfDate": stringType().optional(),
5856
- "note": stringType().optional()
6519
+ "note": stringType().max(updateInitiativeBodyOneGateEvidenceNoteMax).optional(),
6520
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
6521
+ "checkedBy": objectType({
6522
+ "userId": stringType().uuid(),
6523
+ "name": stringType()
6524
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who ticked it. Ignored in requests.")
5857
6525
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
5858
6526
  "gateBypassed": booleanType().optional(),
5859
6527
  "aiAct": objectType({
@@ -5869,28 +6537,28 @@ var UpdateInitiativeBody = objectType({
5869
6537
  "integratesThirdPartyGpai": booleanType().optional(),
5870
6538
  "upstreamGpaiProvider": stringType().optional(),
5871
6539
  "upstreamGpaiInfoAvailable": booleanType().optional(),
5872
- "prohibitedPractices": arrayType(stringType()),
5873
- "art50Flags": arrayType(stringType()),
6540
+ "prohibitedPractices": arrayType(stringType().max(updateInitiativeBodyOneAiActProhibitedPracticesItemMax)).max(updateInitiativeBodyOneAiActProhibitedPracticesMax),
6541
+ "art50Flags": arrayType(stringType().max(updateInitiativeBodyOneAiActArt50FlagsItemMax)).max(updateInitiativeBodyOneAiActArt50FlagsMax),
5874
6542
  "publicSector": booleanType().optional(),
5875
6543
  "establishedOutsideEU": booleanType().optional(),
5876
- "classificationRationale": stringType().optional(),
6544
+ "classificationRationale": stringType().max(updateInitiativeBodyOneAiActClassificationRationaleMax).optional(),
5877
6545
  "classificationConfirmed": booleanType().optional(),
5878
6546
  "classificationConfirmedBy": stringType().optional(),
5879
6547
  "classificationConfirmedAt": stringType().optional(),
5880
6548
  "artifacts": recordType(stringType(), objectType({
5881
6549
  "status": enumType(["Not started", "Draft", "In Review", "Approved", "Outdated"]),
5882
- "owner": stringType().optional(),
6550
+ "owner": stringType().max(updateInitiativeBodyOneAiActArtifactsOwnerMax).optional(),
5883
6551
  "lastReviewedAt": stringType().optional(),
5884
- "link": stringType().optional(),
5885
- "note": stringType().optional(),
6552
+ "link": stringType().max(updateInitiativeBodyOneAiActArtifactsLinkMax).optional(),
6553
+ "note": stringType().max(updateInitiativeBodyOneAiActArtifactsNoteMax).optional(),
5886
6554
  "maxAgeDays": numberType().optional()
5887
6555
  })).optional(),
5888
6556
  "obligations": recordType(stringType(), objectType({
5889
6557
  "status": enumType(["Not started", "In Progress", "Done", "N/A"]),
5890
- "owner": stringType().optional(),
6558
+ "owner": stringType().max(updateInitiativeBodyOneAiActObligationsOwnerMax).optional(),
5891
6559
  "dueDate": stringType().optional(),
5892
- "evidenceLink": stringType().optional(),
5893
- "approver": stringType().optional(),
6560
+ "evidenceLink": stringType().max(updateInitiativeBodyOneAiActObligationsEvidenceLinkMax).optional(),
6561
+ "approver": stringType().max(updateInitiativeBodyOneAiActObligationsApproverMax).optional(),
5894
6562
  "approvalDate": stringType().optional(),
5895
6563
  "reviewDate": stringType().optional()
5896
6564
  })).optional(),
@@ -5917,16 +6585,16 @@ var UpdateInitiativeBody = objectType({
5917
6585
  "occurredAt": stringType(),
5918
6586
  "detectedAt": stringType(),
5919
6587
  "category": enumType(["general", "death-or-serious-damage", "cybersecurity", "fundamental-rights", "infrastructure-disruption"]),
5920
- "description": stringType(),
6588
+ "description": stringType().max(updateInitiativeBodyOneAiActIncidentsItemDescriptionMax),
5921
6589
  "status": enumType(["open", "reported", "closed"]),
5922
- "authorityRef": stringType().optional(),
5923
- "owner": stringType().optional(),
5924
- "rootCause": stringType().optional(),
5925
- "correctiveActions": stringType().optional(),
6590
+ "authorityRef": stringType().max(updateInitiativeBodyOneAiActIncidentsItemAuthorityRefMax).optional(),
6591
+ "owner": stringType().max(updateInitiativeBodyOneAiActIncidentsItemOwnerMax).optional(),
6592
+ "rootCause": stringType().max(updateInitiativeBodyOneAiActIncidentsItemRootCauseMax).optional(),
6593
+ "correctiveActions": stringType().max(updateInitiativeBodyOneAiActIncidentsItemCorrectiveActionsMax).optional(),
5926
6594
  "reportedAt": stringType().optional(),
5927
6595
  "createdAt": stringType(),
5928
6596
  "updatedAt": stringType()
5929
- })).optional()
6597
+ })).max(updateInitiativeBodyOneAiActIncidentsMax).optional()
5930
6598
  }).optional(),
5931
6599
  "createdBy": objectType({
5932
6600
  "userId": stringType().uuid(),
@@ -5936,6 +6604,7 @@ var UpdateInitiativeBody = objectType({
5936
6604
  "userId": stringType().uuid(),
5937
6605
  "name": stringType()
5938
6606
  }).optional().describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body."),
6607
+ "version": numberType().min(1).optional().describe("Save counter, raised by the server on every save. A request names the version its edit is based on in InitiativeInput.baseVersion; this field is ignored in requests."),
5939
6608
  "createdAt": stringType(),
5940
6609
  "updatedAt": stringType()
5941
6610
  }).and(objectType({
@@ -5943,15 +6612,63 @@ var UpdateInitiativeBody = objectType({
5943
6612
  "createdBy": unknownType().optional(),
5944
6613
  "updatedBy": unknownType().optional(),
5945
6614
  "createdAt": unknownType().optional(),
5946
- "updatedAt": unknownType().optional()
6615
+ "updatedAt": unknownType().optional(),
6616
+ "version": unknownType().optional(),
6617
+ "baseVersion": numberType().min(1).optional().describe("PUT only: the version the edit is based on. When it differs from the stored version, someone else saved in between and the save is refused with 409 and the current copy. Omitted (clients that predate it), the save is not checked. A separate field, not `version`, because older clients echo every field they received, including `version`, without ever updating it.")
5947
6618
  })).describe("Same as Initiative, minus server-assigned fields.");
6619
+ var updateInitiativeResponseNameMax = 200;
6620
+ var updateInitiativeResponseExternalIdMax = 200;
6621
+ var updateInitiativeResponseBusinessUnitMax = 200;
6622
+ var updateInitiativeResponseOwnerMax = 200;
6623
+ var updateInitiativeResponseDescriptionMax = 1e4;
6624
+ var updateInitiativeResponseAiCategoryMax = 200;
6625
+ var updateInitiativeResponseTagsItemMax = 200;
6626
+ var updateInitiativeResponseTagsMax = 1e3;
6627
+ var updateInitiativeResponseDocsUrlMax = 2e3;
6628
+ var updateInitiativeResponsePmUrlMax = 2e3;
6629
+ var updateInitiativeResponseDecisionLogItemOwnerMax = 200;
6630
+ var updateInitiativeResponseDecisionLogItemRationaleMax = 1e4;
6631
+ var updateInitiativeResponseDecisionLogMax = 1e3;
6632
+ var updateInitiativeResponseStatusReportsItemAuthorMax = 200;
6633
+ var updateInitiativeResponseStatusReportsItemScopeCommentMax = 1e4;
6634
+ var updateInitiativeResponseStatusReportsItemTimelineCommentMax = 1e4;
6635
+ var updateInitiativeResponseStatusReportsItemBudgetCommentMax = 1e4;
6636
+ var updateInitiativeResponseStatusReportsItemSkillsCommentMax = 1e4;
6637
+ var updateInitiativeResponseStatusReportsItemSummaryMax = 1e4;
6638
+ var updateInitiativeResponseStatusReportsMax = 1e3;
6639
+ var updateInitiativeResponseDependsOnMax = 1e3;
6640
+ var updateInitiativeResponseRequiredSkillsItemRunFteMin = 0;
6641
+ var updateInitiativeResponseRequiredSkillsMax = 1e3;
6642
+ var updateInitiativeResponseCapabilityImpactsItemMaturityToMax = 5;
6643
+ var updateInitiativeResponseCapabilityImpactsMax = 1e3;
6644
+ var updateInitiativeResponseDpiaUrlMax = 2e3;
6645
+ var updateInitiativeResponseModelCardUrlMax = 2e3;
6646
+ var updateInitiativeResponseProhibitedOverrideMax = 2e3;
6647
+ var updateInitiativeResponseGateEvidenceNoteMax = 1e4;
6648
+ var updateInitiativeResponseAiActProhibitedPracticesItemMax = 200;
6649
+ var updateInitiativeResponseAiActProhibitedPracticesMax = 100;
6650
+ var updateInitiativeResponseAiActArt50FlagsItemMax = 200;
6651
+ var updateInitiativeResponseAiActArt50FlagsMax = 100;
6652
+ var updateInitiativeResponseAiActClassificationRationaleMax = 1e4;
6653
+ var updateInitiativeResponseAiActArtifactsOwnerMax = 200;
6654
+ var updateInitiativeResponseAiActArtifactsLinkMax = 2e3;
6655
+ var updateInitiativeResponseAiActArtifactsNoteMax = 1e4;
6656
+ var updateInitiativeResponseAiActObligationsOwnerMax = 200;
6657
+ var updateInitiativeResponseAiActObligationsEvidenceLinkMax = 2e3;
6658
+ var updateInitiativeResponseAiActObligationsApproverMax = 200;
6659
+ var updateInitiativeResponseAiActIncidentsItemDescriptionMax = 1e4;
6660
+ var updateInitiativeResponseAiActIncidentsItemAuthorityRefMax = 2e3;
6661
+ var updateInitiativeResponseAiActIncidentsItemOwnerMax = 200;
6662
+ var updateInitiativeResponseAiActIncidentsItemRootCauseMax = 1e4;
6663
+ var updateInitiativeResponseAiActIncidentsItemCorrectiveActionsMax = 1e4;
6664
+ var updateInitiativeResponseAiActIncidentsMax = 1e3;
5948
6665
  var UpdateInitiativeResponse = objectType({
5949
6666
  "id": stringType(),
5950
- "name": stringType(),
5951
- "externalId": stringType().optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
5952
- "businessUnit": stringType(),
5953
- "owner": stringType(),
5954
- "description": stringType(),
6667
+ "name": stringType().max(updateInitiativeResponseNameMax),
6668
+ "externalId": stringType().max(updateInitiativeResponseExternalIdMax).optional().describe("The organisation's own reference for the initiative (project number, Jira key, IC id, \u2026)"),
6669
+ "businessUnit": stringType().max(updateInitiativeResponseBusinessUnitMax),
6670
+ "owner": stringType().max(updateInitiativeResponseOwnerMax),
6671
+ "description": stringType().max(updateInitiativeResponseDescriptionMax),
5955
6672
  "status": enumType(["Idea", "Pilot", "Scaling", "In Production", "On Hold", "Retired"]),
5956
6673
  "timelineStart": stringType(),
5957
6674
  "timelineEnd": stringType(),
@@ -5959,15 +6676,20 @@ var UpdateInitiativeResponse = objectType({
5959
6676
  "budgetForwardLooking": numberType().optional(),
5960
6677
  "vendorDependency": enumType(["None", "Single Vendor", "Multi-Vendor", "Internal Build", "Hybrid"]),
5961
6678
  "solutionType": enumType(["Internal", "External", "Hybrid"]),
5962
- "aiCategory": stringType(),
5963
- "tags": arrayType(stringType()),
5964
- "docsUrl": stringType().optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
5965
- "pmUrl": stringType().optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
6679
+ "aiCategory": stringType().max(updateInitiativeResponseAiCategoryMax),
6680
+ "tags": arrayType(stringType().max(updateInitiativeResponseTagsItemMax)).max(updateInitiativeResponseTagsMax),
6681
+ "docsUrl": stringType().max(updateInitiativeResponseDocsUrlMax).optional().describe("Link to the project documentation (Confluence, SharePoint, \u2026)"),
6682
+ "pmUrl": stringType().max(updateInitiativeResponsePmUrlMax).optional().describe("Link to the project-management tool (Jira, MS Project, \u2026)"),
5966
6683
  "archived": booleanType(),
5967
6684
  "evaluation": objectType({
5968
6685
  "valueScale": objectType({
5969
6686
  "score": numberType(),
5970
- "confidence": enumType(["Low", "Medium", "High"])
6687
+ "confidence": enumType(["Low", "Medium", "High"]),
6688
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6689
+ "scoredBy": objectType({
6690
+ "userId": stringType().uuid(),
6691
+ "name": stringType()
6692
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5971
6693
  }).and(objectType({
5972
6694
  "subs": objectType({
5973
6695
  "frequencyOfProcess": numberType(),
@@ -5981,7 +6703,12 @@ var UpdateInitiativeResponse = objectType({
5981
6703
  })),
5982
6704
  "feasibility": objectType({
5983
6705
  "score": numberType(),
5984
- "confidence": enumType(["Low", "Medium", "High"])
6706
+ "confidence": enumType(["Low", "Medium", "High"]),
6707
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6708
+ "scoredBy": objectType({
6709
+ "userId": stringType().uuid(),
6710
+ "name": stringType()
6711
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5985
6712
  }).and(objectType({
5986
6713
  "subs": objectType({
5987
6714
  "dataAvailability": numberType(),
@@ -5995,7 +6722,12 @@ var UpdateInitiativeResponse = objectType({
5995
6722
  })),
5996
6723
  "governance": objectType({
5997
6724
  "score": numberType(),
5998
- "confidence": enumType(["Low", "Medium", "High"])
6725
+ "confidence": enumType(["Low", "Medium", "High"]),
6726
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6727
+ "scoredBy": objectType({
6728
+ "userId": stringType().uuid(),
6729
+ "name": stringType()
6730
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
5999
6731
  }).and(objectType({
6000
6732
  "subs": objectType({
6001
6733
  "regulatoryExposure": numberType(),
@@ -6010,7 +6742,12 @@ var UpdateInitiativeResponse = objectType({
6010
6742
  })),
6011
6743
  "strategic": objectType({
6012
6744
  "score": numberType(),
6013
- "confidence": enumType(["Low", "Medium", "High"])
6745
+ "confidence": enumType(["Low", "Medium", "High"]),
6746
+ "scoredAt": stringType().optional().describe("Server stamp: when this dimension's confidence or a sub-score last changed. Absent until a save changes it. Ignored in requests."),
6747
+ "scoredBy": objectType({
6748
+ "userId": stringType().uuid(),
6749
+ "name": stringType()
6750
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who made that change. Ignored in requests.")
6014
6751
  }).and(objectType({
6015
6752
  "subs": objectType({
6016
6753
  "strategicDifferentiation": numberType(),
@@ -6042,7 +6779,8 @@ var UpdateInitiativeResponse = objectType({
6042
6779
  "y1Pct": numberType(),
6043
6780
  "y2Pct": numberType()
6044
6781
  }).optional(),
6045
- "discountRatePct": numberType().optional()
6782
+ "discountRatePct": numberType().optional(),
6783
+ "operatingCostAnnual": numberType().optional()
6046
6784
  }).optional(),
6047
6785
  "actuals": objectType({
6048
6786
  "operatingCostAnnual": numberType().optional(),
@@ -6062,48 +6800,64 @@ var UpdateInitiativeResponse = objectType({
6062
6800
  "id": stringType(),
6063
6801
  "date": stringType(),
6064
6802
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
6065
- "owner": stringType().optional(),
6066
- "rationale": stringType().optional(),
6067
- "createdAt": stringType().optional()
6068
- })).optional(),
6803
+ "owner": stringType().max(updateInitiativeResponseDecisionLogItemOwnerMax).optional(),
6804
+ "rationale": stringType().max(updateInitiativeResponseDecisionLogItemRationaleMax).optional(),
6805
+ "createdAt": stringType().optional(),
6806
+ "recordedAt": stringType().optional().describe("Server stamp: when the entry was recorded or its content last changed (`date` is when the decision was taken). Absent on entries not saved since the stamps were introduced. Ignored in requests."),
6807
+ "recordedBy": objectType({
6808
+ "userId": stringType().uuid(),
6809
+ "name": stringType()
6810
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who recorded it. Ignored in requests.")
6811
+ })).max(updateInitiativeResponseDecisionLogMax).optional(),
6069
6812
  "statusReports": arrayType(objectType({
6070
6813
  "id": stringType(),
6071
6814
  "date": stringType(),
6072
- "author": stringType().optional(),
6815
+ "author": stringType().max(updateInitiativeResponseStatusReportsItemAuthorMax).optional(),
6073
6816
  "scope": objectType({
6074
6817
  "rag": enumType(["green", "yellow", "red"]),
6075
- "comment": stringType().optional()
6818
+ "comment": stringType().max(updateInitiativeResponseStatusReportsItemScopeCommentMax).optional()
6076
6819
  }),
6077
6820
  "timeline": objectType({
6078
6821
  "rag": enumType(["green", "yellow", "red"]),
6079
- "comment": stringType().optional()
6822
+ "comment": stringType().max(updateInitiativeResponseStatusReportsItemTimelineCommentMax).optional()
6080
6823
  }),
6081
6824
  "budget": objectType({
6082
6825
  "rag": enumType(["green", "yellow", "red"]),
6083
- "comment": stringType().optional()
6826
+ "comment": stringType().max(updateInitiativeResponseStatusReportsItemBudgetCommentMax).optional()
6084
6827
  }),
6085
6828
  "skills": objectType({
6086
6829
  "rag": enumType(["green", "yellow", "red"]),
6087
- "comment": stringType().optional()
6830
+ "comment": stringType().max(updateInitiativeResponseStatusReportsItemSkillsCommentMax).optional()
6088
6831
  }),
6089
- "summary": stringType().optional()
6090
- })).optional(),
6091
- "dependsOn": arrayType(stringType()),
6832
+ "summary": stringType().max(updateInitiativeResponseStatusReportsItemSummaryMax).optional()
6833
+ })).max(updateInitiativeResponseStatusReportsMax).optional(),
6834
+ "dependsOn": arrayType(stringType()).max(updateInitiativeResponseDependsOnMax),
6092
6835
  "requiredSkills": arrayType(objectType({
6093
6836
  "skillId": stringType(),
6094
- "fte": numberType()
6095
- })).optional(),
6837
+ "fte": numberType(),
6838
+ "runFte": numberType().min(updateInitiativeResponseRequiredSkillsItemRunFteMin).optional()
6839
+ })).max(updateInitiativeResponseRequiredSkillsMax).optional(),
6840
+ "capabilityImpacts": arrayType(objectType({
6841
+ "capabilityId": stringType(),
6842
+ "kind": enumType(["improve", "new", "replace", "retire"]),
6843
+ "maturityTo": numberType().min(1).max(updateInitiativeResponseCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
6844
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(updateInitiativeResponseCapabilityImpactsMax).optional(),
6096
6845
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
6097
6846
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
6098
6847
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
6099
- "dpiaUrl": stringType().optional(),
6848
+ "dpiaUrl": stringType().max(updateInitiativeResponseDpiaUrlMax).optional(),
6100
6849
  "modelCardStatus": enumType(["Not Required", "Draft", "Published"]).optional(),
6101
- "modelCardUrl": stringType().optional(),
6102
- "prohibitedOverride": stringType().optional(),
6850
+ "modelCardUrl": stringType().max(updateInitiativeResponseModelCardUrlMax).optional(),
6851
+ "prohibitedOverride": stringType().max(updateInitiativeResponseProhibitedOverrideMax).optional(),
6103
6852
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
6104
6853
  "checked": booleanType(),
6105
6854
  "asOfDate": stringType().optional(),
6106
- "note": stringType().optional()
6855
+ "note": stringType().max(updateInitiativeResponseGateEvidenceNoteMax).optional(),
6856
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
6857
+ "checkedBy": objectType({
6858
+ "userId": stringType().uuid(),
6859
+ "name": stringType()
6860
+ }).describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body.").optional().describe("Server stamp, who ticked it. Ignored in requests.")
6107
6861
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
6108
6862
  "gateBypassed": booleanType().optional(),
6109
6863
  "aiAct": objectType({
@@ -6119,28 +6873,28 @@ var UpdateInitiativeResponse = objectType({
6119
6873
  "integratesThirdPartyGpai": booleanType().optional(),
6120
6874
  "upstreamGpaiProvider": stringType().optional(),
6121
6875
  "upstreamGpaiInfoAvailable": booleanType().optional(),
6122
- "prohibitedPractices": arrayType(stringType()),
6123
- "art50Flags": arrayType(stringType()),
6876
+ "prohibitedPractices": arrayType(stringType().max(updateInitiativeResponseAiActProhibitedPracticesItemMax)).max(updateInitiativeResponseAiActProhibitedPracticesMax),
6877
+ "art50Flags": arrayType(stringType().max(updateInitiativeResponseAiActArt50FlagsItemMax)).max(updateInitiativeResponseAiActArt50FlagsMax),
6124
6878
  "publicSector": booleanType().optional(),
6125
6879
  "establishedOutsideEU": booleanType().optional(),
6126
- "classificationRationale": stringType().optional(),
6880
+ "classificationRationale": stringType().max(updateInitiativeResponseAiActClassificationRationaleMax).optional(),
6127
6881
  "classificationConfirmed": booleanType().optional(),
6128
6882
  "classificationConfirmedBy": stringType().optional(),
6129
6883
  "classificationConfirmedAt": stringType().optional(),
6130
6884
  "artifacts": recordType(stringType(), objectType({
6131
6885
  "status": enumType(["Not started", "Draft", "In Review", "Approved", "Outdated"]),
6132
- "owner": stringType().optional(),
6886
+ "owner": stringType().max(updateInitiativeResponseAiActArtifactsOwnerMax).optional(),
6133
6887
  "lastReviewedAt": stringType().optional(),
6134
- "link": stringType().optional(),
6135
- "note": stringType().optional(),
6888
+ "link": stringType().max(updateInitiativeResponseAiActArtifactsLinkMax).optional(),
6889
+ "note": stringType().max(updateInitiativeResponseAiActArtifactsNoteMax).optional(),
6136
6890
  "maxAgeDays": numberType().optional()
6137
6891
  })).optional(),
6138
6892
  "obligations": recordType(stringType(), objectType({
6139
6893
  "status": enumType(["Not started", "In Progress", "Done", "N/A"]),
6140
- "owner": stringType().optional(),
6894
+ "owner": stringType().max(updateInitiativeResponseAiActObligationsOwnerMax).optional(),
6141
6895
  "dueDate": stringType().optional(),
6142
- "evidenceLink": stringType().optional(),
6143
- "approver": stringType().optional(),
6896
+ "evidenceLink": stringType().max(updateInitiativeResponseAiActObligationsEvidenceLinkMax).optional(),
6897
+ "approver": stringType().max(updateInitiativeResponseAiActObligationsApproverMax).optional(),
6144
6898
  "approvalDate": stringType().optional(),
6145
6899
  "reviewDate": stringType().optional()
6146
6900
  })).optional(),
@@ -6167,16 +6921,16 @@ var UpdateInitiativeResponse = objectType({
6167
6921
  "occurredAt": stringType(),
6168
6922
  "detectedAt": stringType(),
6169
6923
  "category": enumType(["general", "death-or-serious-damage", "cybersecurity", "fundamental-rights", "infrastructure-disruption"]),
6170
- "description": stringType(),
6924
+ "description": stringType().max(updateInitiativeResponseAiActIncidentsItemDescriptionMax),
6171
6925
  "status": enumType(["open", "reported", "closed"]),
6172
- "authorityRef": stringType().optional(),
6173
- "owner": stringType().optional(),
6174
- "rootCause": stringType().optional(),
6175
- "correctiveActions": stringType().optional(),
6926
+ "authorityRef": stringType().max(updateInitiativeResponseAiActIncidentsItemAuthorityRefMax).optional(),
6927
+ "owner": stringType().max(updateInitiativeResponseAiActIncidentsItemOwnerMax).optional(),
6928
+ "rootCause": stringType().max(updateInitiativeResponseAiActIncidentsItemRootCauseMax).optional(),
6929
+ "correctiveActions": stringType().max(updateInitiativeResponseAiActIncidentsItemCorrectiveActionsMax).optional(),
6176
6930
  "reportedAt": stringType().optional(),
6177
6931
  "createdAt": stringType(),
6178
6932
  "updatedAt": stringType()
6179
- })).optional()
6933
+ })).max(updateInitiativeResponseAiActIncidentsMax).optional()
6180
6934
  }).optional(),
6181
6935
  "createdBy": objectType({
6182
6936
  "userId": stringType().uuid(),
@@ -6186,6 +6940,7 @@ var UpdateInitiativeResponse = objectType({
6186
6940
  "userId": stringType().uuid(),
6187
6941
  "name": stringType()
6188
6942
  }).optional().describe("Display reference to the local user who created / last edited a record. Server-assigned from the authenticated session \u2014 never taken from the request body."),
6943
+ "version": numberType().min(1).optional().describe("Save counter, raised by the server on every save. A request names the version its edit is based on in InitiativeInput.baseVersion; this field is ignored in requests."),
6189
6944
  "createdAt": stringType(),
6190
6945
  "updatedAt": stringType()
6191
6946
  });
@@ -6222,7 +6977,7 @@ var ListAdminAuditLogQueryParams = objectType({
6222
6977
  });
6223
6978
  var ListAdminAuditLogResponseItem = objectType({
6224
6979
  "id": stringType().uuid(),
6225
- "action": enumType(["member.added", "member.role_changed", "member.permissions_changed", "member.removed", "settings.updated", "permission_profile.created", "permission_profile.updated", "permission_profile.deleted", "initiative.created", "initiative.deleted", "user.erased"]),
6980
+ "action": enumType(["member.added", "member.role_changed", "member.permissions_changed", "member.removed", "settings.updated", "permission_profile.created", "permission_profile.updated", "permission_profile.deleted", "initiative.created", "initiative.deleted", "snapshot.created", "snapshot.renamed", "snapshot.deleted", "skill.created", "skill.updated", "skill.deleted", "capability.created", "capability.updated", "capability.deleted", "organization.renamed", "user.erased"]),
6226
6981
  "targetType": stringType(),
6227
6982
  "targetId": stringType().nullable(),
6228
6983
  "actorName": stringType().nullable(),
@@ -6328,6 +7083,9 @@ var GATE_TRANSITIONS = [
6328
7083
  { key: "scaling-production", from: "Scaling", to: "In Production" }
6329
7084
  ];
6330
7085
  var GATE_TRANSITION_KEYS = GATE_TRANSITIONS.map((t) => t.key);
7086
+ var CAPABILITY_IMPORTANCES = ["differentiating", "core", "supporting"];
7087
+ var CAPABILITY_MATURITY_MIN = 1;
7088
+ var CAPABILITY_MATURITY_MAX = 5;
6331
7089
  var ANNEX_III_CATEGORIES = [
6332
7090
  "Biometrics",
6333
7091
  "Critical Infrastructure",
@@ -6377,6 +7135,9 @@ var OPERATIONAL_OBLIGATION_KEYS = [
6377
7135
  "deployer-operational-monitoring",
6378
7136
  "deployer-escalation-path",
6379
7137
  "deployer-persons-informed",
7138
+ "deployer-verify-risk-mgmt",
7139
+ "deployer-verify-data-governance",
7140
+ "deployer-verify-technical-documentation",
6380
7141
  "provider-qms-applied",
6381
7142
  "provider-conformity-assessment",
6382
7143
  "provider-post-market-monitoring",
@@ -6393,7 +7154,9 @@ var OPERATIONAL_OBLIGATION_KEYS = [
6393
7154
  "gpai-systemic-incident-tracking",
6394
7155
  "gpai-systemic-cybersecurity",
6395
7156
  "art50-ai-interaction-disclosed",
7157
+ "deployer-verify-interaction-disclosure",
6396
7158
  "art50-synthetic-content-marked",
7159
+ "art50-generated-text-disclosed",
6397
7160
  "art50-emotion-biometric-disclosed",
6398
7161
  "art50-deepfake-disclosed",
6399
7162
  "importer-verify-conformity",
@@ -6405,8 +7168,8 @@ var PORTFOLIO_MODES = ["ai", "digital", "innovation"];
6405
7168
  var EN_AI = {};
6406
7169
  var DE_AI = {};
6407
7170
  var EN_DIGITAL = {
6408
- "brand.app": "Digital Portfolio Steering",
6409
- "brand.mobile": "BICon \xB7 Digital Portfolio Steering",
7171
+ "brand.app": "BICon Portfolio Steering",
7172
+ "brand.mobile": "BICon Portfolio Steering",
6410
7173
  "brand.motto": "Digital investments multiply value, but they can also multiply complexity.",
6411
7174
  "filters.aiCategory": "Digital category",
6412
7175
  "evaluate.field.aiCategory": "Digital Category",
@@ -6453,6 +7216,7 @@ var EN_DIGITAL = {
6453
7216
  "govLabel.Controlled Automation": "Controlled Operation",
6454
7217
  "govLabel.Human-in-the-Loop Required": "Supervised Operation Required",
6455
7218
  "govLabel.Restricted Deployment": "Restricted Rollout",
7219
+ "memo.governance.intro": "{count} initiatives sit in the Restricted Rollout band or above (governance \u2265 61/100) and require active board-level monitoring.",
6456
7220
  "subHelp.modelRobustness": "Stability of the solution under load, edge cases and unexpected inputs.",
6457
7221
  "subHelp.reproducibility": "Maturity of the underlying cloud / platform stack \u2014 proven and supported (managed services, mature regions, SLAs) vs experimental or self-hosted.",
6458
7222
  "subHelp.explainability": "How clearly the system's behaviour and outputs can be explained to operators and end-users.",
@@ -6463,9 +7227,7 @@ var EN_DIGITAL = {
6463
7227
  "subHelp.cybersecurityExposure": "Attack surface introduced \u2014 data flows, identities, third-party APIs, supply chain.",
6464
7228
  "subHelp.innovationCapability": "Strengthening of internal digital muscle \u2014 talent, platforms, tooling, reusable assets.",
6465
7229
  "scenarios.lever.adoptionSpeed": "Rollout Speed",
6466
- "scenarios.lever.oversightIntensity": "Operational Oversight",
6467
7230
  "scenarios.leverHelp.adoptionSpeed": "How quickly initiatives move from Pilot \u2192 Rollout \u2192 Production at scale.",
6468
- "scenarios.leverHelp.oversightIntensity": "Operational monitoring, SRE practice and four-eyes review in production.",
6469
7231
  "prioritisation.cat.Quick Wins": "Quick Wins",
6470
7232
  "prioritisation.cat.Strategic Core Initiatives": "Strategic Platform Initiatives",
6471
7233
  "prioritisation.cat.High Governance Risk": "High Compliance Risk",
@@ -6483,7 +7245,7 @@ var EN_DIGITAL = {
6483
7245
  "settings.prio.operatingModel": "Operating Model Modernisation",
6484
7246
  "settings.prio.subtitle": "Thresholds used by the Prioritisation page to assign each digital initiative to a strategic archetype. Rules are evaluated top-to-bottom and the first match wins. All values are scores out of 100 across the four dimensions: V = Value & Scale, F = Delivery Feasibility & Operability, C = Compliance & Operational Risk, S = Strategic Impact.",
6485
7247
  "inventory.col.scores": "Scores (V/F/C/S)",
6486
- "concept.eyebrow": "Digital Portfolio Steering",
7248
+ "concept.eyebrow": "Steering of AI, digital and transformation portfolios",
6487
7249
  "concept.title": "Turn fragmented digital projects into a managed portfolio.",
6488
7250
  "concept.lead": "Digital initiatives create value only when they are prioritised, governed and scaled systematically. This console helps boards and steering committees decide which digital projects to roll out, which to keep in pilot, and which to stop.",
6489
7251
  "concept.quote": "Treat digital initiatives not as isolated projects, but as a managed portfolio of capabilities \u2014 assessed along a consistent set of dimensions that capture both value creation and delivery risk.",
@@ -6515,16 +7277,15 @@ var EN_DIGITAL = {
6515
7277
  "inventory.sort.feasibility": "Sort: Delivery feasibility",
6516
7278
  "portfolio.axis.y": "Delivery Feasibility & Operability",
6517
7279
  "portfolio.tooltip.feasibility": "Delivery Feasibility",
6518
- "op.input.feasibility": "Delivery Feasibility",
6519
7280
  "evaluate.profile.radarFeasibility": "Delivery",
6520
7281
  "evaluate.profile.radarGovernance": "Compliance",
6521
7282
  "inventory.title": "Digital Initiative Inventory",
6522
7283
  "inventory.subtitle": "Manage and evaluate your portfolio of digital initiatives.",
6523
7284
  "inventory.empty.title": "Digital investments multiply value, but they can also multiply complexity.",
6524
7285
  "inventory.empty.subtitle": "Begin by adding your enterprise digital initiatives to the portfolio, or load the strategic demo dataset to explore the evaluation frameworks.",
6525
- "memo.summary.portfolio": "The enterprise currently runs {count} active digital initiatives with an aggregate committed budget of {budget}.",
7286
+ "memo.summary.portfolio": "The enterprise currently runs {count} active digital initiatives with a committed budget of {budget} (from {stPilot} onwards).",
6526
7287
  "governance.subtitle": "Executive oversight of digital delivery risk, compliance exposure and operational dependencies.",
6527
- "op.subtitle": "Organisational implications of the current digital portfolio across staffing, compliance, scalability, customer interaction and operating-model evolution.",
7288
+ "op.subtitle": "Organisational implications of the current digital portfolio: the governance work it creates, how much of the business now depends on it, how ready delivery is, whether it can absorb volume, how far it shifts the operating model, how much labour it automates, and how far along it is.",
6528
7289
  "concentration.subtitle": "Detect systemic exposure across vendor strategy, digital category, business unit, and compliance band. HHI thresholds: <1500 diversified, 1500\u20132500 moderate, >2500 highly concentrated.",
6529
7290
  "concentration.hhi.category": "Digital category",
6530
7291
  "concentration.heatmap.title": "Cluster heatmap \u2014 business unit \xD7 digital category",
@@ -6535,8 +7296,8 @@ var EN_DIGITAL = {
6535
7296
  "boardPack.heatmap.subtitle": "Business unit \xD7 digital category \u2014 clusters where one BU stacks one digital capability.",
6536
7297
  "portfolio.custom.metric.feasibility": "Delivery Feasibility",
6537
7298
  "subHelp.operationalLeverage": "How much the digital solution multiplies output per unit of human work. Higher = broader operational reach per FTE.",
6538
- "op.staffing.level3": "Dedicated digital control function",
6539
- "scenarios.subtitle": "A what-if tool: pick a strategic stance, move the sliders, and see how five portfolio outcomes change. Everything is calculated live from the sliders \u2014 no forecasting.",
7299
+ "op.governance.level3": "Dedicated digital control function",
7300
+ "scenarios.subtitle": "A what-if tool: pick a strategic stance, move the sliders, and see how three portfolio outcomes change. Everything is calculated live from the sliders \u2014 no forecasting.",
6540
7301
  "scenarios.preset.transformational.desc": "Reshape the operating model around digital; high readiness and diversified vendor base.",
6541
7302
  "memo.heading": "Board Memorandum \u2014 Digital Transformation Portfolio",
6542
7303
  "memo.concentration.category": "Digital category concentration: {name} accounts for {count} of {total} initiatives ({pct}%).",
@@ -6557,10 +7318,9 @@ var EN_DIGITAL = {
6557
7318
  "method.s4.stop": "<strong>Stop</strong> \u2014 Business Impact &lt; 50 and Delivery Feasibility &lt; 50. Low impact and low feasibility \u2014 defer or sunset.",
6558
7319
  "method.s4.bubbles": "Bubble size additionally emphasises Strategic Impact on its own (so a strategic initiative reads as a larger bubble even when its value score is moderate); bubble colour reflects the compliance & operational-risk band.",
6559
7320
  "method.s5.governance": "<strong>High Compliance & Operational Risk</strong> (precedence 3) \u2014 compliance & operational-risk score \u2265 {g} (and the initiative was not already classified as Quick Wins or Strategic Core). Elevated regulatory, compliance or operational-risk exposure that must be addressed before scaling.",
6560
- "method.s8.b3": "No external regulatory, operational-risk or third-party assurance signals are incorporated.",
6561
7321
  "memo.assumptions.signals": "No external regulatory, operational-risk or third-party assurance signals have been incorporated into these scores.",
6562
7322
  "method.s6.p1": 'The <a href="https://www.investopedia.com/terms/h/hhi.asp" target="_blank" rel="noopener noreferrer" class="text-primary underline underline-offset-2 hover:no-underline">Herfindahl\u2013Hirschman Index</a> is applied to four cuts of the portfolio: <strong>vendor strategy</strong>, <strong>solution type</strong>, <strong>digital category</strong>, and <strong>business unit</strong>.',
6563
- "method.s6.p2": "For the Scenarios page, each per-dimension HHI is mapped to a 0\u2013100 risk score using the same thresholds, then blended <strong>35 / 20 / 20 / 15</strong> (vendor / solution type / digital category / business unit) with a further <strong>10 %</strong> weight on average operational dependency. The overall reading is then lifted toward the worst single dimension (50 / 50 blend of weighted average and maximum), so a highly concentrated vendor strategy alone pushes the score up even if the other dimensions look balanced. A business-unit \xD7 digital-category cluster heatmap on the Concentration page surfaces specific over-exposed combinations beyond the aggregate.",
7323
+ "method.s6.p2": "A business-unit \xD7 digital-category cluster heatmap on the Concentration page surfaces specific over-exposed combinations beyond the aggregate.",
6564
7324
  "concept.problem.p1": "Many organisations are pursuing digital initiatives across a wide range of business processes. These initiatives often emerge from local experimentation within business units or technology teams rather than from a structured strategic process.",
6565
7325
  "concept.dim.value.body": "Economic leverage of the digital solution. Use cases addressing high-frequency, resource-intensive activities typically offer the greatest potential for economic impact; limited-scale or marginal-efficiency cases rarely justify the organisational effort required.",
6566
7326
  "concept.dim.feasibility.body": "Practical reliability of the digital solution in the given context. In regulated environments technical feasibility alone is rarely enough \u2014 the solution must also be operable, monitorable and defensible before it can leave experimentation.",
@@ -6569,10 +7329,10 @@ var EN_DIGITAL = {
6569
7329
  "concept.dim.governance.body": "Digital systems introduce new forms of operational, regulatory and reputational risk. Governance defines how they are controlled, monitored and limited \u2014 whether they may be fully automated, must keep humans in the loop, or are subject to deployment restrictions.",
6570
7330
  "concept.dim.governance.q1": "What is the worst-case impact of a failure or incorrect output of the digital system?",
6571
7331
  "scenarios.leverHelp.automationIntensity": "How much of human work the digital portfolio takes on (straight-through processing, end-to-end automation).",
6572
- "scenarios.calc.baselineNote": "Baseline is different: its five numbers are read directly from your Inventory, not from the levers. Adoption = % of active initiatives in Production or Scaling. Governance Load = average of governance scores (weighted with human oversight, monitoring complexity and auditability). Transformation = average of strategic sub-scores for transformation potential and operating-model alignment. Concentration Risk uses the same HHI methodology as the Concentration page: a per-dimension risk score (vendor, solution type, digital category, business unit) is derived from HHI thresholds (<1500 diversified, 1500\u20132500 moderate, >2500 highly concentrated), blended 35/20/20/15 with 10% operational dependency \u2014 and the overall reading is lifted toward the worst single dimension so a highly concentrated vendor strategy alone pushes the score up. Delivery Confidence = average of feasibility scores.",
6573
- "op.staffing.detailHigh": "Recommend a central digital control function with named accountability per high-governance initiative.",
6574
- "op.scalability.detailHigh": "The portfolio is positioned to scale; ensure platform and operations capacity matches demand.",
6575
- "op.customer.detailHigh": "Direct customer exposure requires explicit transparency, accessibility and complaints-handling controls.",
7332
+ "scenarios.calc.baselineNote": "Baseline is different: its three numbers are read directly from your Inventory, not from the levers. Adoption = % of active initiatives in Production or Scaling. Transformation = average of strategic sub-scores for transformation potential and operating-model alignment. Delivery Confidence = average of feasibility scores.",
7333
+ "op.governance.detailHigh": "Recommend a central digital control function with named accountability per high-governance initiative.",
7334
+ "op.governance.detailMed": "Oversight is more than incidental: name a part-time owner for operational risk and keep review time in the delivery plan.",
7335
+ "op.delivery.detailHigh": "Data, integration and platform foundations are sound across the portfolio; ensure platform and operations capacity keeps pace.",
6576
7336
  "dim.valueScale.intro": "Score the economic leverage of this digital solution \u2014 how much measurable value it can generate and how broadly it can scale across the enterprise. Higher scores indicate broad, repeatable, financially material impact rather than a single-team efficiency gain.",
6577
7337
  "dim.feasibility.intro": "Score how realistic delivery is given current data, integration, operability and traceability constraints. In regulated environments technical feasibility alone is rarely enough \u2014 higher scores indicate the solution can be built, operated, monitored and defended to operators and auditors.",
6578
7338
  "dim.governance.intro": "Score the regulatory, oversight, auditability, security and reputational exposure of the digital system. Higher scores mean MORE sensitivity and a greater control load on operations and the board \u2014 covering whether the system may run unattended, must keep humans in the loop, or needs deployment restrictions.",
@@ -6583,15 +7343,15 @@ var EN_DIGITAL = {
6583
7343
  "dim.governance.band2.label": "Supervised operation",
6584
7344
  "dim.governance.band3.meaning": "Active board-level oversight, audit trail and access controls required for the digital system.",
6585
7345
  "dim.strategic.band3.meaning": "Reshapes operating model, customer experience, or how data is used across the business.",
6586
- "op.staffing.detailLow": "Embedded delivery teams with part-time operational-risk coverage are typically sufficient at this load.",
7346
+ "op.governance.detailLow": "Embedded delivery teams with part-time operational-risk coverage are typically sufficient at this load.",
6587
7347
  "boardPack.col.g": "C",
6588
7348
  // ── Concept & Methodology page theming ────────────────────────────────
6589
7349
  "concept.problem.p3": "Without a shared rubric the failure modes are predictable: <strong>pilot fatigue</strong> (many proofs of concept, few productions), <strong>redundant tooling</strong> across business units, <strong>compliance debt</strong> that surfaces only at audit time, and <strong>shadow IT</strong> that escapes both budget and risk visibility.",
6590
- "concept.problem.p4": "BICon is built for the steering audience: <strong>CIO, CDO, CTO, COO</strong>, Digital Council, Risk and Compliance \u2014 anyone who needs one reproducible portfolio view across functions, not a per-team backlog.",
7350
+ "concept.problem.p4": "BICon Portfolio Steering is built for the steering audience: <strong>CIO, CDO, CTO, COO</strong>, Digital Council, Risk and Compliance \u2014 anyone who needs one reproducible portfolio view across functions, not a per-team backlog.",
6591
7351
  "concept.problem.p5": "Unlike classic PPM tools (Jira Portfolio, Planview, ServiceNow SPM) this console is purpose-built for AI / Digital / Innovation steering: explicit compliance bands, dependency-aware stage-gates and a deterministic prioritisation rule book \u2014 not generic project tasks and Gantt charts.",
6592
7352
  "concept.gettingStarted.s2.body": "For each initiative open Evaluate, set the four 0\u2013100 dimension scores with confidence, add dependencies and Stage-gate evidence. The Soft-Sync hint catches contradictions; the decision log keeps the audit trail.",
6593
7353
  "concept.gettingStarted.s3.body": "Check the Portfolio Map (Scale / Pilot / Assist / Stop), the Value-at-Stake view and the Compliance bands. Concentration and Operating Model surface where the portfolio is over-exposed.",
6594
- "concept.gettingStarted.s5.body": "Run Scenarios for \u221210 % / \u221220 % budget, freeze a Snapshot, then export the Executive Memo and Board Pack (PDF/PPTX) \u2014 bilingual, with the full Stage-gate section. The Board Memo and Steering KPIs surface the forward-looking budget alongside Net 3-year value so the board sees what is still allocatable.",
7354
+ "concept.gettingStarted.s5.body": "Try a \u221210 % / \u221220 % budget on Strategic Prioritisation, freeze a Snapshot, then export the Executive Memo and Board Pack (PDF/PPTX) \u2014 bilingual, with the full Stage-gate section. The Board Memo and Steering KPIs surface the forward-looking budget alongside Net 3-year value so the board sees what is still allocatable.",
6595
7355
  "concept.pillar.portfolio.b1": "Multi-dimensional scoring: value, delivery feasibility, compliance & operational risk, strategic fit",
6596
7356
  "concept.glossary.hhi": "<strong>HHI (Herfindahl\u2013Hirschman Index)</strong> \u2014 concentration metric. 0 = perfectly diversified, 10 000 = single dominant share. Used here on vendor, solution type, digital category and business unit cuts.",
6597
7357
  "concept.features.f5.body": "Automatic compliance-band assignment per initiative, plus concentration cuts by business unit and operating model. Provides early visibility on dependency on a single unit, platform or vendor for risk and compliance review.",
@@ -6619,21 +7379,18 @@ var EN_DIGITAL = {
6619
7379
  "method.s5.uncategorised": "<strong>Tactical / Uncategorised</strong> (precedence 7) \u2014 fallback for initiatives that don't satisfy any of rules 1\u20136. Treat as tactical until scores sharpen.",
6620
7380
  "method.s5.ranking": "<strong>Ranking inside the queue.</strong> Initiatives are first grouped by the category rules above (precedence 1 \u2192 7), then within each category ordered by <strong>Value</strong> score descending, then \u2014 if Value-at-Stake weighting is enabled in Settings and the row sits in Quick Wins / Strategic Platform Initiatives \u2014 Year-3 benefit descending. Final tie-break is <strong>Strategic Impact</strong> descending, then name A\u2192Z, so the result is deterministic and reproducible.",
6621
7381
  "method.s10.p7": "<strong>Quick Win definition.</strong> The Quick Wins category requires fast time-to-value. Therefore a Quick Win that depends on an active non-Quick-Win upstream (Strategic Platform Initiative, Operating Model Modernisation, High Compliance Risk etc.) is automatically demoted out of Quick Wins \u2014 the upstream's pre-work makes it no longer quick. The rule is transitive: if A depends on B, and B is itself demoted, A is also demoted in the next iteration.",
6622
- "method.s7.p1": "Five named presets (Baseline, Accelerated Adoption, Controlled Scaling, Defensive Posture, Operating Model Transformation) plus Custom, each driven by six explicit levers: rollout speed, governance strictness, automation intensity, organisational readiness, vendor diversification, operational oversight.",
6623
- "method.s7.p2": "<strong>Baseline is special.</strong> Its slider positions are derived directly from your Inventory \u2014 rollout speed = % of active initiatives In Production or Scaling, governance strictness = average compliance &amp; operational-risk score, automation intensity = average transformation potential, organisational readiness = average of organisational leverage and integration feasibility, vendor diversification = 100 \u2212 vendor HHI risk, operational oversight = average oversight sub-score. These derived positions also act as the <strong>neutral reference</strong> for the projection.",
6624
- "method.s7.p3": "Projected outcomes are computed as transparent linear blends of the levers' <strong>delta from this Baseline</strong>, combined with structural inputs from the portfolio (production-stage share, compliance-load average, HHI-based concentration risk, delivery-feasibility average). Selecting Baseline therefore overlays Current on top of Baseline by construction; moving any slider produces an honest delta from where the portfolio actually sits today.",
6625
7382
  "method.audit.scope.governance": "<strong>Status</strong> and the four <strong>evaluation dimension scores</strong> (Value, Delivery Feasibility, Compliance &amp; Operational Risk, Strategic Impact) with their confidence.",
6626
7383
  "method.audit.scope.metadata": "<strong>All Core Metadata fields</strong> \u2014 name, business unit, owner, description, timeline, budget, vendor strategy, solution type, digital category and tags.",
6627
7384
  "method.gates.enforced.intro": "Two governance fields are enforced as hard checks when the lifecycle status changes \u2014 active because the EU AI Act module is enabled for this workspace:",
6628
7385
  "method.gates.enforced.scope": "Both checks feed the EU AI Act readiness score in addition to the hard block."
6629
7386
  };
6630
7387
  var DE_DIGITAL = {
6631
- "brand.app": "Digital-Portfolio-Steuerung",
6632
- "brand.mobile": "BICon \xB7 Digital-Portfolio-Steuerung",
7388
+ "brand.app": "BICon Portfolio Steering",
7389
+ "brand.mobile": "BICon Portfolio Steering",
6633
7390
  "brand.motto": "Digitale Investitionen vervielfachen den Nutzen, aber auch die Komplexit\xE4t.",
6634
7391
  "filters.aiCategory": "Digital-Kategorie",
6635
7392
  "evaluate.field.aiCategory": "Digital-Kategorie",
6636
- "evaluate.fieldHelp.aiCategory": "Bestimmt die Digital-Kategorie-Konzentration (Seite \u201EKonzentration\u201C) und den Kategorie-Mix im Vorstandsmemo. Wird au\xDFerdem zur Filterung im Inventar verwendet.",
7393
+ "evaluate.fieldHelp.aiCategory": "Bestimmt die Digital-Kategorie-Konzentration (Seite \u201EKonzentration\u201C) und den Kategorie-Mix im Vorstandsmemo. Wird ausserdem zur Filterung im Inventar verwendet.",
6637
7394
  "category.Generative AI": "Kundenkan\xE4le",
6638
7395
  "category.Predictive AI": "Daten & Analytik",
6639
7396
  "category.Automation": "Workflow-Automatisierung",
@@ -6676,6 +7433,7 @@ var DE_DIGITAL = {
6676
7433
  "govLabel.Controlled Automation": "Kontrollierter Betrieb",
6677
7434
  "govLabel.Human-in-the-Loop Required": "Beaufsichtigter Betrieb erforderlich",
6678
7435
  "govLabel.Restricted Deployment": "Eingeschr\xE4nkter Rollout",
7436
+ "memo.governance.intro": "{count} Initiativen liegen im Band \u201EEingeschr\xE4nkter Rollout\u201C oder dar\xFCber (Governance \u2265 61/100) und ben\xF6tigen aktive Vorstandsaufsicht.",
6679
7437
  "subHelp.modelRobustness": "Stabilit\xE4t der L\xF6sung unter Last, bei Edge-Cases und unerwarteten Eingaben.",
6680
7438
  "subHelp.reproducibility": "Reife des zugrundeliegenden Cloud-/Plattform-Stacks \u2014 bew\xE4hrt und supportet (Managed Services, etablierte Regionen, SLAs) vs. experimentell oder selbstgehostet.",
6681
7439
  "subHelp.explainability": "Wie klar Verhalten und Ergebnisse des Systems Betreibern und Endnutzern erkl\xE4rbar sind.",
@@ -6686,9 +7444,7 @@ var DE_DIGITAL = {
6686
7444
  "subHelp.cybersecurityExposure": "Eingef\xFChrte Angriffsfl\xE4che \u2014 Datenfl\xFCsse, Identit\xE4ten, Drittanbieter-APIs, Lieferkette.",
6687
7445
  "subHelp.innovationCapability": "Aufbau interner digitaler Muskeln \u2014 Talente, Plattformen, Tooling, wiederverwendbare Bausteine.",
6688
7446
  "scenarios.lever.adoptionSpeed": "Rollout-Tempo",
6689
- "scenarios.lever.oversightIntensity": "Operative Aufsicht",
6690
7447
  "scenarios.leverHelp.adoptionSpeed": "Wie schnell Initiativen von Pilot \u2192 Rollout \u2192 Produktion in der Breite wandern.",
6691
- "scenarios.leverHelp.oversightIntensity": "Operatives Monitoring, SRE-Praxis und Vier-Augen-Prinzip im Produktivbetrieb.",
6692
7448
  "prioritisation.cat.Quick Wins": "Quick Wins",
6693
7449
  "prioritisation.cat.Strategic Core Initiatives": "Strategische Plattform-Initiativen",
6694
7450
  "prioritisation.cat.High Governance Risk": "Hohes Compliance-Risiko",
@@ -6706,7 +7462,7 @@ var DE_DIGITAL = {
6706
7462
  "settings.prio.operatingModel": "Betriebsmodell-Modernisierung",
6707
7463
  "settings.prio.subtitle": "Schwellenwerte, mit denen die Priorisierungsseite jede digitale Initiative einem strategischen Archetyp zuordnet. Die Regeln werden von oben nach unten gepr\xFCft, die erste \xDCbereinstimmung gewinnt. Alle Werte sind Punkte von 0\u2013100 \xFCber die vier Dimensionen: W = Wert & Skalierung, M = Umsetzbarkeit & Betreibbarkeit, C = Compliance & Betriebsrisiko, S = Strategischer Impact.",
6708
7464
  "inventory.col.scores": "Punkte (W/M/C/S)",
6709
- "concept.eyebrow": "Digital-Portfolio-Steuerung",
7465
+ "concept.eyebrow": "Steuerung von KI-, Digital- und Transformationsportfolios",
6710
7466
  "concept.title": "Fragmentierte Digitalprojekte in ein gesteuertes Portfolio verwandeln.",
6711
7467
  "concept.lead": "Digitale Initiativen schaffen nur dann Wert, wenn sie systematisch priorisiert, gesteuert und skaliert werden. Diese Konsole hilft Vorst\xE4nden und Steuerungsgremien zu entscheiden, welche Digitalprojekte ausgerollt, welche im Pilot weitergef\xFChrt und welche eingestellt werden sollten.",
6712
7468
  "concept.quote": "Digitale Initiativen sind nicht als isolierte Projekte zu betrachten, sondern als gesteuertes Portfolio von F\xE4higkeiten \u2014 bewertet entlang eines einheitlichen Satzes von Dimensionen, die sowohl Wertbeitrag als auch Liefer- und Betriebsrisiko erfassen.",
@@ -6723,7 +7479,7 @@ var DE_DIGITAL = {
6723
7479
  "concept.quad.Scale.body": "Hoher Wert, hohe Lieferzuversicht und beherrschbares Risiko \u2014 bereit f\xFCr den unternehmensweiten Roll-out.",
6724
7480
  "concept.quad.Pilot.body": "Vielversprechendes Potenzial, aber technische, Integrations- oder organisatorische Unsicherheit \u2014 vor dem Skalieren pilotieren.",
6725
7481
  "concept.quad.Assist.body": "Wertvoll, aber noch nicht stabil genug f\xFCr die Skalierung \u2014 zun\xE4chst Grundlagen st\xE4rken.",
6726
- "concept.quad.Stop.body": "Begrenzter Wert oder \xFCberm\xE4\xDFiges Liefer- und Compliance-Risiko \u2014 zur\xFCckstellen oder beenden.",
7482
+ "concept.quad.Stop.body": "Begrenzter Wert oder \xFCberm\xE4ssiges Liefer- und Compliance-Risiko \u2014 zur\xFCckstellen oder beenden.",
6727
7483
  "concept.features.f1.body": "Jede Digitalinitiative mit Gesch\xE4ftseinheit, Owner, Tags, Lebenszyklus und 0\u2013100-Bewertung \xFCber alle vier Dimensionen erfassen.",
6728
7484
  "concept.features.f2.body": "Business-Impact \xD7 Lieferzuversicht als Blasendiagramm, eingef\xE4rbt nach Compliance-Band, mit Ausrollen / Pilot / St\xE4rken / Stopp-Quadrantenz\xE4hlung.",
6729
7485
  "dim.feasibility.title": "Liefer-Machbarkeit & Betreibbarkeit",
@@ -6738,16 +7494,15 @@ var DE_DIGITAL = {
6738
7494
  "inventory.sort.feasibility": "Sortieren: Liefer-Machbarkeit",
6739
7495
  "portfolio.axis.y": "Liefer-Machbarkeit & Betreibbarkeit",
6740
7496
  "portfolio.tooltip.feasibility": "Liefer-Machbarkeit",
6741
- "op.input.feasibility": "Liefer-Machbarkeit",
6742
7497
  "evaluate.profile.radarFeasibility": "Lieferung",
6743
7498
  "evaluate.profile.radarGovernance": "Compliance",
6744
7499
  "inventory.title": "Digital-Initiativen-Inventar",
6745
7500
  "inventory.subtitle": "Verwalten und bewerten Sie Ihr Portfolio digitaler Initiativen.",
6746
7501
  "inventory.empty.title": "Digitale Investitionen vervielfachen den Nutzen, aber auch die Komplexit\xE4t.",
6747
7502
  "inventory.empty.subtitle": "F\xFCgen Sie zuerst Ihre digitalen Initiativen dem Portfolio hinzu, oder laden Sie den strategischen Demodatensatz, um die Bewertungsrahmen zu erkunden.",
6748
- "memo.summary.portfolio": "Das Unternehmen f\xFChrt aktuell {count} aktive digitale Initiativen mit einem zugesagten Gesamtbudget von {budget}.",
7503
+ "memo.summary.portfolio": "Das Unternehmen f\xFChrt aktuell {count} aktive digitale Initiativen mit einem zugesagten Budget von {budget} (ab {stPilot}).",
6749
7504
  "governance.subtitle": "F\xFChrungsaufsicht \xFCber Lieferrisiken, Compliance-Exposition und operative Abh\xE4ngigkeiten im Digital-Portfolio.",
6750
- "op.subtitle": "Organisatorische Implikationen des aktuellen Digital-Portfolios \xFCber Staffing, Compliance, Skalierbarkeit, Kundeninteraktion und Betriebsmodell-Entwicklung.",
7505
+ "op.subtitle": "Organisatorische Implikationen des aktuellen Digital-Portfolios: welche Governance-Arbeit es erzeugt, wie viel des Gesch\xE4fts inzwischen daran h\xE4ngt, wie lieferbereit es ist, ob es Mengen verkraftet, wie stark es das Betriebsmodell verschiebt, wie viel Arbeit es automatisiert und wie weit es fortgeschritten ist.",
6751
7506
  "concentration.subtitle": "Systemische Exposition \xFCber Anbieterstrategie, Digital-Kategorie, Gesch\xE4ftseinheit und Compliance-Band erkennen. HHI-Schwellen: <1500 diversifiziert, 1500\u20132500 moderat, >2500 hoch konzentriert.",
6752
7507
  "concentration.hhi.category": "Digital-Kategorie",
6753
7508
  "concentration.heatmap.title": "Cluster-Heatmap \u2014 Gesch\xE4ftseinheit \xD7 Digital-Kategorie",
@@ -6757,9 +7512,9 @@ var DE_DIGITAL = {
6757
7512
  "ie.boardPack.coverTitlePlaceholder": "Digital-Portfolio \u2014 Vorstandssitzung Q3 2026",
6758
7513
  "boardPack.heatmap.subtitle": "Gesch\xE4ftseinheit \xD7 Digital-Kategorie \u2014 Cluster, in denen eine GE eine digitale F\xE4higkeit b\xFCndelt.",
6759
7514
  "portfolio.custom.metric.feasibility": "Liefer-Machbarkeit",
6760
- "subHelp.operationalLeverage": "Wie stark die digitale L\xF6sung den Output pro menschlicher Arbeitseinheit multipliziert. H\xF6her = gr\xF6\xDFere operative Reichweite pro FTE.",
6761
- "op.staffing.level3": "Dedizierte Digital-Kontrollfunktion",
6762
- "scenarios.subtitle": "Ein What-if-Werkzeug: eine strategische Haltung w\xE4hlen, die Regler bewegen und sehen, wie sich f\xFCnf Portfolio-Kennzahlen ver\xE4ndern. Alles wird live aus den Reglern berechnet \u2014 keine Prognose.",
7515
+ "subHelp.operationalLeverage": "Wie stark die digitale L\xF6sung den Output pro menschlicher Arbeitseinheit multipliziert. H\xF6her = gr\xF6ssere operative Reichweite pro FTE.",
7516
+ "op.governance.level3": "Dedizierte Digital-Kontrollfunktion",
7517
+ "scenarios.subtitle": "Ein What-if-Werkzeug: eine strategische Haltung w\xE4hlen, die Regler bewegen und sehen, wie sich drei Portfolio-Kennzahlen ver\xE4ndern. Alles wird live aus den Reglern berechnet \u2014 keine Prognose.",
6763
7518
  "scenarios.preset.transformational.desc": "Betriebsmodell um Digital neu gestalten; hohe Reife und diversifizierte Anbieterbasis.",
6764
7519
  "memo.heading": "Vorstandsmemo \u2014 Digital-Transformations-Portfolio",
6765
7520
  "memo.concentration.category": "Digital-Kategoriekonzentration: {name} stellt {count} von {total} Initiativen ({pct}%).",
@@ -6768,7 +7523,7 @@ var DE_DIGITAL = {
6768
7523
  "method.s2.title": "2. Compliance- & Betriebsrisiko-Klassifikation",
6769
7524
  "method.s2.subtitle": "Compliance- & Betriebsrisiko-B\xE4nder und was sie f\xFCr die Kontroll-Last bedeuten.",
6770
7525
  "method.s2.intro": "Initiativen werden auf Basis des Compliance- & Betriebsrisiko-Werts klassifiziert:",
6771
- "method.s2.b2": "<strong>21\u201340 \xB7 Standard-Kontrollen</strong>: Standardmonitoring; regelm\xE4\xDFige \xDCberpr\xFCfung.",
7526
+ "method.s2.b2": "<strong>21\u201340 \xB7 Standard-Kontrollen</strong>: Standardmonitoring; regelm\xE4ssige \xDCberpr\xFCfung.",
6772
7527
  "method.s2.b3": "<strong>41\u201360 \xB7 Erweiterte Betriebskontrollen</strong>: dokumentierte Verfahren, Vier-Augen-Prinzip, aktives Monitoring.",
6773
7528
  "method.s2.b4": "<strong>61\u201380 \xB7 Eingeschr\xE4nkter Rollout</strong>: aktive Vorstandsaufsicht, Audit-Trail und Zugriffskontrollen.",
6774
7529
  "method.s2.b5": "<strong>81\u2013100 \xB7 Vorstandspatenschaft erforderlich</strong>: als wesentliches Risiko behandeln; nur mit Ringfencing einsetzen.",
@@ -6778,24 +7533,23 @@ var DE_DIGITAL = {
6778
7533
  "method.s4.assist": "<strong>St\xE4rken</strong> \u2014 Business Impact \u2265 50 und Liefer-Machbarkeit &lt; 50. Wertvoll, aber Lieferung noch nicht robust \u2014 Betreibbarkeit ausbauen, bevor skaliert wird.",
6779
7534
  "method.s4.pilot": "<strong>Pilot</strong> \u2014 Business Impact &lt; 50 und Liefer-Machbarkeit \u2265 50. Technisch lieferbar, aber unklarer Business Case \u2014 vor der Skalierung pilotieren.",
6780
7535
  "method.s4.stop": "<strong>Stopp</strong> \u2014 Business Impact &lt; 50 und Liefer-Machbarkeit &lt; 50. Geringer Impact und geringe Machbarkeit \u2014 zur\xFCckstellen oder beenden.",
6781
- "method.s4.bubbles": "Die Blasengr\xF6\xDFe betont zus\xE4tzlich den strategischen Impact f\xFCr sich (eine strategische Initiative erscheint also gr\xF6\xDFer, selbst wenn ihr Wert-Score moderat ist); die Farbe spiegelt das Compliance- & Betriebsrisiko-Band wider.",
7536
+ "method.s4.bubbles": "Die Blasengr\xF6sse betont zus\xE4tzlich den strategischen Impact f\xFCr sich (eine strategische Initiative erscheint also gr\xF6sser, selbst wenn ihr Wert-Score moderat ist); die Farbe spiegelt das Compliance- & Betriebsrisiko-Band wider.",
6782
7537
  "method.s5.governance": "<strong>Hohes Compliance- & Betriebsrisiko</strong> (Pr\xE4zedenz 3) \u2014 Compliance- & Betriebsrisiko-Wert \u2265 {g} (und die Initiative wurde nicht bereits als Quick Wins oder Strategische Kerninitiative klassifiziert). Erh\xF6hte regulatorische, Compliance- oder Betriebsrisiko-Exposition, die vor einer Skalierung adressiert werden muss.",
6783
- "method.s8.b3": "Es werden keine externen regulatorischen, Betriebsrisiko- oder Drittparteien-Signale ber\xFCcksichtigt.",
6784
7538
  "memo.assumptions.signals": "Es wurden keine externen regulatorischen, Betriebsrisiko- oder Drittparteien-Signale in diese Scores einbezogen.",
6785
7539
  "method.s6.p1": 'Der <a href="https://www.investopedia.com/terms/h/hhi.asp" target="_blank" rel="noopener noreferrer" class="text-primary underline underline-offset-2 hover:no-underline">Herfindahl\u2013Hirschman-Index</a> wird auf vier Schnitte angewendet: <strong>Anbieterstrategie</strong>, <strong>L\xF6sungstyp</strong>, <strong>Digital-Kategorie</strong> und <strong>Gesch\xE4ftseinheit</strong>.',
6786
- "method.s6.p2": "F\xFCr die Szenarien-Seite wird jeder dimensionale HHI mit denselben Schwellenwerten auf einen Risikowert 0\u2013100 abgebildet und anschlie\xDFend zu <strong>35 / 20 / 20 / 15</strong> (Vendor / L\xF6sungstyp / Digital-Kategorie / Gesch\xE4ftseinheit) gewichtet, plus weiteren <strong>10 %</strong> f\xFCr die durchschnittliche operative Abh\xE4ngigkeit. Der Gesamtwert wird dann in Richtung der schlechtesten Einzeldimension angehoben (50 / 50-Mischung aus gewichtetem Durchschnitt und Maximum), sodass z. B. eine hoch konzentrierte Vendor-Strategie allein den Score nach oben zieht \u2013 auch wenn die \xFCbrigen Dimensionen ausgewogen wirken. Eine Gesch\xE4ftseinheit-\xD7-Digital-Kategorie-Heatmap auf der Konzentrations-Seite deckt dar\xFCber hinaus spezifische \xFCberexponierte Kombinationen jenseits des Aggregats auf.",
7540
+ "method.s6.p2": "Eine Gesch\xE4ftseinheit-\xD7-Digital-Kategorie-Heatmap auf der Konzentrations-Seite deckt dar\xFCber hinaus spezifische \xFCberexponierte Kombinationen jenseits des Aggregats auf.",
6787
7541
  "concept.problem.p1": "Viele Organisationen verfolgen Digital-Initiativen \xFCber eine Vielzahl von Gesch\xE4ftsprozessen hinweg. Diese Initiativen entstehen h\xE4ufig aus lokalen Experimenten in einzelnen Gesch\xE4ftseinheiten oder Technologieteams \u2013 nicht aus einem strukturierten strategischen Prozess.",
6788
- "concept.dim.value.body": "\xD6konomischer Hebel der digitalen L\xF6sung. Anwendungsf\xE4lle mit hochfrequenten, ressourcenintensiven Aktivit\xE4ten bieten das gr\xF6\xDFte Potenzial f\xFCr \xF6konomische Wirkung; F\xE4lle mit begrenztem Volumen oder marginalen Effizienzgewinnen rechtfertigen den organisatorischen Aufwand selten.",
7542
+ "concept.dim.value.body": "\xD6konomischer Hebel der digitalen L\xF6sung. Anwendungsf\xE4lle mit hochfrequenten, ressourcenintensiven Aktivit\xE4ten bieten das gr\xF6sste Potenzial f\xFCr \xF6konomische Wirkung; F\xE4lle mit begrenztem Volumen oder marginalen Effizienzgewinnen rechtfertigen den organisatorischen Aufwand selten.",
6789
7543
  "concept.dim.feasibility.body": "Praktische Zuverl\xE4ssigkeit der digitalen L\xF6sung im jeweiligen Kontext. In regulierten Umgebungen reicht technische Machbarkeit allein selten aus \u2013 die L\xF6sung muss auch betreibbar, \xFCberwachbar und vertretbar sein, bevor sie das Experimentierstadium verlassen kann.",
6790
7544
  "concept.dim.feasibility.q2": "Sind die Ergebnisse der L\xF6sung stabil und \xFCber Umgebungen hinweg reproduzierbar?",
6791
7545
  "concept.dim.feasibility.q3": "L\xE4sst sich das Verhalten der L\xF6sung f\xFCr Betreiber und Auditoren erkl\xE4ren und nachvollziehen?",
6792
7546
  "concept.dim.governance.body": "Digitale Systeme bringen neue Formen operationeller, regulatorischer und reputativer Risiken mit sich. Governance bestimmt, wie sie kontrolliert, \xFCberwacht und beschr\xE4nkt werden \u2013 ob sie vollst\xE4ndig automatisiert werden d\xFCrfen, einen Menschen in der Schleife ben\xF6tigen oder Einsatzbeschr\xE4nkungen unterliegen.",
6793
- "concept.dim.governance.q1": "Wie gro\xDF ist der Worst-Case-Effekt eines Ausfalls oder einer fehlerhaften Ausgabe des digitalen Systems?",
7547
+ "concept.dim.governance.q1": "Wie gross ist der Worst-Case-Effekt eines Ausfalls oder einer fehlerhaften Ausgabe des digitalen Systems?",
6794
7548
  "scenarios.leverHelp.automationIntensity": "Wieviel menschliche Arbeit das Digital-Portfolio \xFCbernimmt (Dunkelverarbeitung, End-to-End-Automatisierung).",
6795
- "scenarios.calc.baselineNote": "Baseline ist anders: die f\xFCnf Kennzahlen werden direkt aus dem Inventar gelesen, nicht aus den Reglern. Adoption = Anteil aktiver Initiativen in Production oder Scaling. Governance-Last = Durchschnitt der Governance-Scores (gewichtet mit menschlicher Aufsicht, Monitoring-Komplexit\xE4t und Auditierbarkeit). Transformation = Durchschnitt der strategischen Sub-Scores f\xFCr Transformationspotenzial und Betriebsmodell-Ausrichtung. Konzentrationsrisiko nutzt dieselbe HHI-Methodik wie die Konzentrations-Seite: pro Dimension (Vendor, L\xF6sungstyp, Digital-Kategorie, Gesch\xE4ftsbereich) wird aus dem HHI ein Risikowert abgeleitet (<1500 diversifiziert, 1500\u20132500 moderat, >2500 hoch konzentriert), gewichtet zu 35/20/20/15 mit 10 % operativer Abh\xE4ngigkeit \u2014 und der Gesamtwert wird in Richtung der schlechtesten Einzeldimension angehoben, sodass z. B. eine hoch konzentrierte Vendor-Strategie allein den Score nach oben zieht. Liefervertrauen = Durchschnitt der Feasibility-Scores.",
6796
- "op.staffing.detailHigh": "Empfehlung: zentrale Digital-Kontrollfunktion mit benannter Verantwortung pro Initiative mit hoher Governance.",
6797
- "op.scalability.detailHigh": "Das Portfolio ist auf Skalierung ausgelegt; Plattform- und Betriebskapazit\xE4t muss zur Nachfrage passen.",
6798
- "op.customer.detailHigh": "Direkter Kundenkontakt erfordert explizite Transparenz-, Barrierefreiheits- und Beschwerdemanagement-Kontrollen.",
7549
+ "scenarios.calc.baselineNote": "Baseline ist anders: die drei Kennzahlen werden direkt aus dem Inventar gelesen, nicht aus den Reglern. Adoption = Anteil aktiver Initiativen in Production oder Scaling. Transformation = Durchschnitt der strategischen Sub-Scores f\xFCr Transformationspotenzial und Betriebsmodell-Ausrichtung. Liefervertrauen = Durchschnitt der Feasibility-Scores.",
7550
+ "op.governance.detailHigh": "Empfehlung: zentrale Digital-Kontrollfunktion mit benannter Verantwortung pro Initiative mit hoher Governance.",
7551
+ "op.governance.detailMed": "Die Aufsicht ist mehr als nebenbei zu leisten: Benennen Sie eine Teilzeit-Verantwortung f\xFCr Betriebsrisiko und planen Sie Pr\xFCfzeit fest ein.",
7552
+ "op.delivery.detailHigh": "Daten-, Integrations- und Plattformgrundlagen tragen portfolioweit; Plattform- und Betriebskapazit\xE4t mitwachsen lassen.",
6799
7553
  "dim.valueScale.intro": "Bewerten Sie den \xF6konomischen Hebel dieser digitalen L\xF6sung \u2014 wie viel messbaren Nutzen sie erzeugt und wie breit sie unternehmensweit skalierbar ist. H\xF6here Werte bedeuten breite, wiederholbare und finanziell relevante Wirkung statt eines einzelnen Effizienzgewinns in einem Team.",
6800
7554
  "dim.feasibility.intro": "Bewerten Sie, wie realistisch die Umsetzung unter aktuellen Daten-, Integrations-, Betriebs- und Nachvollziehbarkeitsbedingungen ist. In regulierten Umgebungen reicht technische Machbarkeit allein selten \u2014 h\xF6here Werte bedeuten, dass die L\xF6sung aufgebaut, betrieben, \xFCberwacht und gegen\xFCber Betreibern und Auditoren vertreten werden kann.",
6801
7555
  "dim.governance.intro": "Bewerten Sie regulatorische, Aufsichts-, Auditierbarkeits-, Sicherheits- und Reputationsexposition des digitalen Systems. H\xF6here Werte bedeuten MEHR Sensitivit\xE4t und h\xF6here Kontroll-Last f\xFCr Betrieb und Vorstand \u2014 also ob das System unbeaufsichtigt laufen darf, einen Menschen in der Schleife braucht oder Einsatzbeschr\xE4nkungen erfordert.",
@@ -6806,17 +7560,17 @@ var DE_DIGITAL = {
6806
7560
  "dim.governance.band2.label": "\xDCberwachter Betrieb",
6807
7561
  "dim.governance.band3.meaning": "Aktive Vorstandsaufsicht, Audit-Trail und Zugriffskontrollen f\xFCr das digitale System erforderlich.",
6808
7562
  "dim.strategic.band3.meaning": "Ver\xE4ndert Betriebsmodell, Kundenerlebnis oder die Datennutzung im Unternehmen.",
6809
- "op.staffing.detailLow": "Eingebettete Teams mit teilweiser Betriebsrisiko-Abdeckung reichen bei dieser Last meist aus.",
7563
+ "op.governance.detailLow": "Eingebettete Teams mit teilweiser Betriebsrisiko-Abdeckung reichen bei dieser Last meist aus.",
6810
7564
  "boardPack.col.g": "C",
6811
7565
  // ── Concept & Methodology page theming ────────────────────────────────
6812
7566
  "concept.problem.p3": "Ohne gemeinsame Bewertungsbasis sind die typischen Fehlermuster vorhersehbar: <strong>Piloten-M\xFCdigkeit</strong> (viele Proofs of Concept, wenige Produktionen), <strong>redundante Werkzeuge</strong> \xFCber Gesch\xE4ftseinheiten hinweg, <strong>Compliance-Schulden</strong>, die erst im Audit sichtbar werden, und <strong>Schatten-IT</strong>, die weder Budget- noch Risikosicht erreicht.",
6813
- "concept.problem.p4": "BICon ist f\xFCr das Steering-Publikum gebaut: <strong>CIO, CDO, CTO, COO</strong>, Digital-Council, Risk und Compliance \u2014 alle, die eine reproduzierbare Portfolio-Sicht \xFCber Funktionen hinweg brauchen, kein Team-Backlog.",
7567
+ "concept.problem.p4": "BICon Portfolio Steering ist f\xFCr das Steering-Publikum gebaut: <strong>CIO, CDO, CTO, COO</strong>, Digital-Council, Risk und Compliance \u2014 alle, die eine reproduzierbare Portfolio-Sicht \xFCber Funktionen hinweg brauchen, kein Team-Backlog.",
6814
7568
  "concept.problem.p5": "Anders als klassische PPM-Werkzeuge (Jira Portfolio, Planview, ServiceNow SPM) ist diese Konsole gezielt f\xFCr KI- / Digital- / Innovations-Steuerung gebaut: explizite Compliance-B\xE4nder, abh\xE4ngigkeitsbewusste Stage-Gates und ein deterministisches Priorisierungs-Regelwerk \u2014 keine generischen Projektaufgaben und Gantt-Charts.",
6815
7569
  "concept.gettingStarted.s2.body": "Je Initiative die Evaluate-Maske \xF6ffnen, die vier 0\u2013100-Dimensionsscores mit Konfidenz setzen, Abh\xE4ngigkeiten und Stage-Gate-Evidenz erg\xE4nzen. Der Soft-Sync-Hinweis f\xE4ngt Widerspr\xFCche, das Entscheidungsprotokoll h\xE4lt den Audit-Trail fest.",
6816
7570
  "concept.gettingStarted.s3.body": "Portfolio-Karte (Scale / Pilot / Assist / Stop), Value-at-Stake-Sicht und Compliance-B\xE4nder pr\xFCfen. Konzentration und Operating Model zeigen, wo das Portfolio \xFCberexponiert ist.",
6817
- "concept.gettingStarted.s5.body": "Szenarien f\xFCr \u221210 % / \u221220 % Budget rechnen, einen Snapshot einfrieren, dann Executive Memo und Board Pack (PDF/PPTX) exportieren \u2014 zweisprachig, mit voller Stage-Gate-Sektion. Board Memo und Steering-KPIs zeigen das vorausschauende Budget neben dem Netto-3-Jahres-Wert, damit das Gremium sieht, was noch alloziierbar ist.",
7571
+ "concept.gettingStarted.s5.body": "Ein Budget von \u221210 % / \u221220 % in der Strategischen Priorisierung durchspielen, einen Snapshot einfrieren, dann Executive Memo und Board Pack (PDF/PPTX) exportieren \u2014 zweisprachig, mit voller Stage-Gate-Sektion. Board Memo und Steering-KPIs zeigen das vorausschauende Budget neben dem Netto-3-Jahres-Wert, damit das Gremium sieht, was noch alloziierbar ist.",
6818
7572
  "concept.pillar.portfolio.b1": "Mehrdimensionales Scoring: Wert, Liefer-Machbarkeit, Compliance & Betriebsrisiko, strategischer Fit",
6819
- "concept.glossary.hhi": "<strong>HHI (Herfindahl\u2013Hirschman-Index)</strong> \u2014 Konzentrationsma\xDF. 0 = vollst\xE4ndig diversifiziert, 10 000 = ein dominanter Anteil. Hier auf Vendor, L\xF6sungstyp, Digital-Kategorie und Gesch\xE4ftseinheit angewendet.",
7573
+ "concept.glossary.hhi": "<strong>HHI (Herfindahl\u2013Hirschman-Index)</strong> \u2014 Konzentrationsmass. 0 = vollst\xE4ndig diversifiziert, 10 000 = ein dominanter Anteil. Hier auf Vendor, L\xF6sungstyp, Digital-Kategorie und Gesch\xE4ftseinheit angewendet.",
6820
7574
  "concept.features.f5.body": "Automatische Zuordnung eines Compliance-Bands je Initiative, plus Konzentrations-Schnitte nach Gesch\xE4ftseinheit und Betriebsmodell. Liefert fr\xFChzeitige Sichtbarkeit auf Abh\xE4ngigkeiten von einer Einheit, einer Plattform oder einem Anbieter f\xFCr Risiko- und Compliance-Reviews.",
6821
7575
  "concept.features.f13.body": "Portfolio-Gesundheit auf einem Bildschirm \u2014 gef\xF6rdert vs. zur\xFCckgestellt, Bewertungs-Verteilung, Transitions at Risk, Compliance-Hotspots und veraltete Gate-Nachweise. Konzipiert f\xFCr das w\xF6chentliche Steering und stehende Gremien-Reviews.",
6822
7576
  "concept.features.f17.body": "Eigene Seite mit HHI-Scores pro Schnitt, einer Gesch\xE4ftseinheit-\xD7-Digital-Kategorie-Heatmap und Drill-downs in \xFCberexponierte Kombinationen \u2014 \xFCber das Aggregat-Signal aus den Compliance-B\xE4ndern hinaus.",
@@ -6824,7 +7578,7 @@ var DE_DIGITAL = {
6824
7578
  "concept.features.f23.body": "Priorisierungs-Schwellen, Stage-Gate-Checklisten und Reminder-Kadenzen sind alle in den Einstellungen editierbar \u2014 so l\xE4sst sich das Framework an Ihr Portfolio anpassen, ohne den Code zu forken.",
6825
7579
  "concept.features.f24.body": "In sich geschlossene Demo-Portfolios pro Modus (KI / Digital / Innovation) laden mit realistischen Initiativen und Abh\xE4ngigkeiten \u2014 sodass neue Nutzer jede Sicht sofort erkunden k\xF6nnen, ohne Daten einzugeben.",
6826
7580
  "concept.features.f29.body": "Die Konsole l\xE4uft als mandantenf\xE4hige SaaS: Jede Organisation ist ein isolierter Mandant mit eigenem Portfolio und eigenen Daten. Mitglieder melden sich \xFCber eine verwaltete Authentifizierung an und erhalten rollenbasierten Zugriff \u2014 Admin, Mitglied oder Betrachter \u2014 verfeinert durch granulare Berechtigungen pro Bereich, die ein Admin in den Einstellungen vergibt und die serverseitig wie auch in der Oberfl\xE4che durchgesetzt werden. Jede governance-kritische und Kern-Metadaten-\xC4nderung wird in einem feldgenauen Audit-Trail mit handelndem Benutzer und Zeitstempel erfasst, und jede Initiative zeigt, wer sie erstellt und zuletzt bearbeitet hat. Cloud-Sync h\xE4lt das gemeinsame Portfolio im Team konsistent, w\xE4hrend der lokale Modus (ohne Konto) weiterhin f\xFCr einen einzelnen Nutzer funktioniert. Privilegierte Admin-Aktionen \u2014 Zugriffsvergaben, Rollen- und Rechte\xE4nderungen, \xC4nderungen an Einstellungen, Profilen und Initiativen \u2014 werden zus\xE4tzlich in einem Admin-Aktivit\xE4tsprotokoll auf Organisationsebene in den Einstellungen erfasst.",
6827
- "concept.features.f30.body": "Eine regelbasierte, nach Dringlichkeit sortierte Liste der Entscheidungen, die die Portfoliodaten selbst einfordern: Stopp-/Aufschub-Kandidaten, Gate-Disziplin, Kapazit\xE4ts- und Budgetengp\xE4sse sowie Konzentration. Nutzenrealisierungs-Regeln markieren Produktionssysteme, die ihren zugesagten Nutzen verfehlen \u2014 oder nie messen. Vom Board gesetzte Leitplanken erg\xE4nzen die roten Linien: Admins definieren Richtwerte in den Einstellungen \u2014 Budgetkonzentrations-Obergrenze je Gesch\xE4ftsbereich, Wert-Untergrenze f\xFCr finanzierte Initiativen und Compliance-Last-Obergrenze \u2014 jeweils mit Live-Pr\xFCfung, und jeder Versto\xDF erscheint hier als Entscheidungspunkt.",
7581
+ "concept.features.f30.body": "Eine regelbasierte, nach Dringlichkeit sortierte Liste der Entscheidungen, die die Portfoliodaten selbst einfordern: Stopp-/Aufschub-Kandidaten, Gate-Disziplin, Kapazit\xE4ts- und Budgetengp\xE4sse sowie Konzentration. Nutzenrealisierungs-Regeln markieren Produktionssysteme, die ihren zugesagten Nutzen verfehlen \u2014 oder nie messen. Vom Board gesetzte Leitplanken erg\xE4nzen die roten Linien: Admins definieren Richtwerte in den Einstellungen \u2014 Budgetkonzentrations-Obergrenze je Gesch\xE4ftsbereich, Wert-Untergrenze f\xFCr finanzierte Initiativen und Compliance-Last-Obergrenze \u2014 jeweils mit Live-Pr\xFCfung, und jeder Verstoss erscheint hier als Entscheidungspunkt.",
6828
7582
  "method.rules.r1.formula": "Nutzen \xD7 Liefer-Machbarkeit \u2192 Portfolio-Gestalt",
6829
7583
  "method.rules.r1.explanation": "Die Quadrantenposition auf der Nutzen-\xD7-Liefer-Machbarkeits-Karte bestimmt die Go-/Skalieren-/Pilot-/Stopp-Entscheidung f\xFCr jede Initiative.",
6830
7584
  "method.rules.r2.formula": "Compliance-Band \u2192 Veto-Kriterium",
@@ -6842,17 +7596,14 @@ var DE_DIGITAL = {
6842
7596
  "method.s5.uncategorised": "<strong>Taktisch / nicht kategorisiert</strong> (Pr\xE4zedenz 7) \u2014 Auffangkategorie f\xFCr Initiativen, die keine der Regeln 1\u20136 erf\xFCllen. Bis zur Sch\xE4rfung der Bewertung taktisch behandeln.",
6843
7597
  "method.s5.ranking": "<strong>Reihenfolge innerhalb der Warteschlange.</strong> Initiativen werden zuerst nach den Kategorie-Regeln oben gruppiert (Pr\xE4zedenz 1 \u2192 7), dann innerhalb jeder Kategorie nach <strong>Value</strong>-Score absteigend geordnet, dann \u2014 wenn die Value-at-Stake-Gewichtung in den Einstellungen aktiv ist und die Zeile in Quick Wins / Strategische Plattform-Initiativen liegt \u2014 nach Jahr-3-Nutzen absteigend. Letzter Tiebreaker ist <strong>Strategischer Impact</strong> absteigend, danach Name A\u2192Z, damit das Ergebnis deterministisch und reproduzierbar ist.",
6844
7598
  "method.s10.p7": "<strong>Quick-Win-Definition.</strong> Die Kategorie Quick Wins setzt schnelle Zeit-zum-Wert voraus. Ein Quick Win, der von einem aktiven, nicht-Quick-Win-en Vorgelagerten abh\xE4ngt (Strategische Plattform-Initiative, Betriebsmodell-Modernisierung, Hohes Compliance-Risiko etc.), wird daher automatisch aus den Quick Wins demotet \u2014 der Vorlauf macht ihn nicht mehr schnell. Die Regel ist transitiv: H\xE4ngt A von B ab und wird B demotet, wird A in der n\xE4chsten Iteration ebenfalls demotet.",
6845
- "method.s7.p1": "F\xFCnf Presets (Baseline, Beschleunigte Einf\xFChrung, Kontrollierte Skalierung, Defensive Haltung, Betriebsmodell-Transformation) plus Custom, getrieben durch sechs explizite Hebel: Rollout-Tempo, Governance-Strenge, Automatisierungsintensit\xE4t, organisatorische Reife, Anbieterdiversifizierung, operative Aufsicht.",
6846
- "method.s7.p2": "<strong>Baseline ist besonders.</strong> Die Reglerpositionen werden direkt aus dem Inventar abgeleitet \u2014 Rollout-Tempo = Anteil aktiver Initiativen in Production oder Scaling, Governance-Strenge = Durchschnitt der Compliance-&amp;-Betriebsrisiko-Scores, Automatisierungsintensit\xE4t = Durchschnitt des Transformationspotenzials, organisatorische Reife = Mittel aus organisatorischer Hebelwirkung und Integrationsmachbarkeit, Anbieterdiversifizierung = 100 \u2212 Vendor-HHI-Risiko, operative Aufsicht = Durchschnitt der Aufsichts-Sub-Scores. Diese abgeleiteten Positionen dienen zugleich als <strong>neutraler Bezugspunkt</strong> f\xFCr die Projektion.",
6847
- "method.s7.p3": "Die projizierten Ergebnisse werden als transparente lineare Kombination der <strong>Hebel-Deltas gegen\xFCber dieser Baseline</strong> berechnet, kombiniert mit strukturellen Inputs aus dem Portfolio (Produktionsanteil, Compliance-Last-Durchschnitt, HHI-basiertes Konzentrationsrisiko, Liefer-Machbarkeits-Durchschnitt). Wenn Baseline gew\xE4hlt ist, liegt Current konstruktionsbedingt deckungsgleich darauf; das Bewegen eines Reglers erzeugt ein ehrliches Delta gegen\xFCber dem heutigen Stand des Portfolios.",
6848
7599
  "method.audit.scope.governance": "<strong>Status</strong> und die vier <strong>Bewertungsdimensions-Scores</strong> (Wert, Liefer-Machbarkeit, Compliance &amp; Betriebsrisiko, Strategischer Impact) mit ihrer Konfidenz.",
6849
7600
  "method.audit.scope.metadata": "<strong>Alle Kern-Metadatenfelder</strong> \u2014 Name, Gesch\xE4ftseinheit, Verantwortliche, Beschreibung, Zeitplan, Budget, Anbieterstrategie, L\xF6sungstyp, Digital-Kategorie und Tags.",
6850
7601
  "method.gates.enforced.intro": "Zwei Governance-Felder werden beim Wechsel des Lebenszyklus-Status als harte Pr\xFCfungen erzwungen \u2014 aktiv, weil das EU-AI-Act-Modul f\xFCr diesen Arbeitsbereich aktiviert ist:",
6851
7602
  "method.gates.enforced.scope": "Beide Pr\xFCfungen fliessen zus\xE4tzlich zum harten Block in den EU-AI-Act-Reifegrad ein."
6852
7603
  };
6853
7604
  var EN_INNOVATION = {
6854
- "brand.app": "Innovation Portfolio Steering",
6855
- "brand.mobile": "BICon \xB7 Innovation Portfolio Steering",
7605
+ "brand.app": "BICon Portfolio Steering",
7606
+ "brand.mobile": "BICon Portfolio Steering",
6856
7607
  "brand.motto": "Innovation multiplies opportunity, but it can also multiply uncertainty.",
6857
7608
  "filters.aiCategory": "Innovation category",
6858
7609
  "evaluate.field.aiCategory": "Innovation Category",
@@ -6877,6 +7628,10 @@ var EN_INNOVATION = {
6877
7628
  "quadrant.Scale.subtitle": "Validated \xB7 ready to industrialise",
6878
7629
  "quadrant.Stop.subtitle": "Low value \xB7 thin evidence",
6879
7630
  "quadrant.Assist.subtitle": "Promising value, evidence still thin",
7631
+ // The feasibility group headers follow the slider relabeling: an innovation
7632
+ // portfolio talks about evidence, not data/model vocabulary.
7633
+ "subGroup.feasibility.data": "Evidence base",
7634
+ "subGroup.feasibility.solution": "Concept properties",
6880
7635
  "sub.dataAvailability": "Evidence Base",
6881
7636
  "sub.dataQuality": "Quality of Evidence",
6882
7637
  "sub.modelRobustness": "Concept Robustness",
@@ -6895,6 +7650,7 @@ var EN_INNOVATION = {
6895
7650
  "govLabel.Controlled Automation": "Monitored Trial",
6896
7651
  "govLabel.Human-in-the-Loop Required": "Active Stewardship Required",
6897
7652
  "govLabel.Restricted Deployment": "Bounded Pilot Only",
7653
+ "memo.governance.intro": "{count} initiatives sit in the Bounded Pilot Only band or above (governance \u2265 61/100) and require active board-level monitoring.",
6898
7654
  "govLabel.High Governance Sensitivity": "Board-Level Sponsorship Required",
6899
7655
  "subHelp.modelRobustness": "How well the core concept holds up under stress, edge cases and pessimistic assumptions.",
6900
7656
  "subHelp.reproducibility": "Likelihood that observed results would repeat under independent conditions.",
@@ -6906,13 +7662,7 @@ var EN_INNOVATION = {
6906
7662
  "subHelp.cybersecurityExposure": "Exposure of confidential data, IP and partner relationships introduced by the work.",
6907
7663
  "subHelp.innovationCapability": "Strengthening of innovation muscle \u2014 talent, methods, partnerships, reusable IP.",
6908
7664
  "scenarios.lever.adoptionSpeed": "Experiment Velocity",
6909
- "scenarios.lever.governanceStrictness": "Stage-Gate Rigour",
6910
- "scenarios.lever.organisationalReadiness": "Team Readiness",
6911
- "scenarios.lever.oversightIntensity": "Coaching Intensity",
6912
7665
  "scenarios.leverHelp.adoptionSpeed": "How quickly ideas move through Explore \u2192 Validate \u2192 Scale.",
6913
- "scenarios.leverHelp.governanceStrictness": "How strict the stage-gate reviews, evidence bars and kill criteria are.",
6914
- "scenarios.leverHelp.organisationalReadiness": "Innovation skills, sponsor support and absorption capacity of the operating business.",
6915
- "scenarios.leverHelp.oversightIntensity": "Active coaching, mentoring and stakeholder review around innovation teams.",
6916
7666
  "prioritisation.cat.Quick Wins": "Easy Experiments",
6917
7667
  "prioritisation.cat.Strategic Core Initiatives": "Scale Candidates",
6918
7668
  "prioritisation.cat.High Governance Risk": "High-Uncertainty Bets",
@@ -6930,7 +7680,7 @@ var EN_INNOVATION = {
6930
7680
  "settings.prio.operatingModel": "New Operating Models",
6931
7681
  "settings.prio.subtitle": "Thresholds used by the Prioritisation page to assign each innovation initiative to a strategic archetype. Rules are evaluated top-to-bottom and the first match wins. All values are scores out of 100 across the four dimensions: V = Value Potential, E = Validation & Evidence, U = Governance & Uncertainty, S = Strategic Impact.",
6932
7682
  "inventory.col.scores": "Scores (V/E/U/S)",
6933
- "concept.eyebrow": "Innovation Portfolio Steering",
7683
+ "concept.eyebrow": "Steering of AI, digital and transformation portfolios",
6934
7684
  "concept.title": "Turn scattered experiments into a managed innovation portfolio.",
6935
7685
  "concept.lead": "Innovation initiatives create value only when they are prioritised, governed and scaled systematically. This console helps boards and innovation committees decide which experiments to scale, which to keep incubating, and which to kill.",
6936
7686
  "concept.quote": "Treat innovation initiatives not as isolated bets, but as a managed portfolio of options \u2014 assessed along a consistent set of dimensions that capture both potential value and remaining uncertainty.",
@@ -6965,8 +7715,6 @@ var EN_INNOVATION = {
6965
7715
  "portfolio.axis.y": "Validation & Evidence",
6966
7716
  "portfolio.tooltip.valueScale": "Value Potential",
6967
7717
  "portfolio.tooltip.feasibility": "Validation",
6968
- "op.input.value": "Value Potential",
6969
- "op.input.feasibility": "Validation",
6970
7718
  "evaluate.profile.radarValue": "Potential",
6971
7719
  "evaluate.profile.radarFeasibility": "Validation",
6972
7720
  "concept.dim.value.title": "1. Value Potential",
@@ -6974,9 +7722,9 @@ var EN_INNOVATION = {
6974
7722
  "inventory.subtitle": "Manage and evaluate your portfolio of innovation initiatives.",
6975
7723
  "inventory.empty.title": "Innovation multiplies opportunity, but it can also multiply uncertainty.",
6976
7724
  "inventory.empty.subtitle": "Begin by adding your innovation initiatives to the portfolio, or load the strategic demo dataset to explore the evaluation frameworks.",
6977
- "memo.summary.portfolio": "The enterprise currently runs {count} active innovation initiatives with an aggregate committed budget of {budget}.",
7725
+ "memo.summary.portfolio": "The enterprise currently runs {count} active innovation initiatives with a committed budget of {budget} (from {stPilot} onwards).",
6978
7726
  "governance.subtitle": "Executive oversight of innovation bets, stage-gate posture and uncertainty exposure.",
6979
- "op.subtitle": "Organisational implications of the current innovation portfolio across staffing, governance, scalability, partnerships and operating-model evolution.",
7727
+ "op.subtitle": "Organisational implications of the current innovation portfolio: the governance work it creates, how much of the business now depends on it, how ready delivery is, whether it can absorb volume, how far it shifts the operating model, how much labour it automates, and how far along it is.",
6980
7728
  "concentration.subtitle": "Detect systemic exposure across partner strategy, innovation category, business unit, and uncertainty band. HHI thresholds: <1500 diversified, 1500\u20132500 moderate, >2500 highly concentrated.",
6981
7729
  "concentration.hhi.category": "Innovation category",
6982
7730
  "concentration.heatmap.title": "Cluster heatmap \u2014 business unit \xD7 innovation category",
@@ -6988,8 +7736,8 @@ var EN_INNOVATION = {
6988
7736
  "portfolio.custom.metric.valueScale": "Value Potential",
6989
7737
  "portfolio.custom.metric.feasibility": "Validation",
6990
7738
  "subHelp.operationalLeverage": "How much the innovation multiplies output per unit of human work. Higher = broader operational reach per FTE.",
6991
- "op.staffing.level3": "Dedicated innovation control function",
6992
- "scenarios.subtitle": "A what-if tool: pick a strategic stance, move the sliders, and see how five portfolio outcomes change. Everything is calculated live from the sliders \u2014 no forecasting.",
7739
+ "op.governance.level3": "Dedicated innovation control function",
7740
+ "scenarios.subtitle": "A what-if tool: pick a strategic stance, move the sliders, and see how three portfolio outcomes change. Everything is calculated live from the sliders \u2014 no forecasting.",
6993
7741
  "scenarios.preset.transformational.desc": "Reshape the operating model around innovation; high readiness and diversified partner base.",
6994
7742
  "memo.heading": "Board Memorandum \u2014 Innovation Portfolio",
6995
7743
  "memo.concentration.category": "Innovation category concentration: {name} accounts for {count} of {total} initiatives ({pct}%).",
@@ -7011,10 +7759,9 @@ var EN_INNOVATION = {
7011
7759
  "method.s4.stop": "<strong>Kill</strong> \u2014 Business Impact &lt; 50 and Validation &lt; 50. Low impact and weak evidence \u2014 kill or recycle the learnings.",
7012
7760
  "method.s4.bubbles": "Bubble size additionally emphasises Strategic Impact on its own (so a strategic bet reads as a larger bubble even when its value score is moderate); bubble colour reflects the uncertainty band.",
7013
7761
  "method.s5.governance": "<strong>High-Uncertainty Bets</strong> (precedence 3) \u2014 governance & uncertainty score \u2265 {g} (and the bet was not already classified as Quick Wins or Strategic Core). Elevated strategic, market or execution uncertainty that must be de-risked through stage-gating before scaling.",
7014
- "method.s8.b3": "No external regulatory, peer-review or third-party assurance signals are incorporated.",
7015
7762
  "memo.assumptions.signals": "No external regulatory, peer-review or third-party assurance signals have been incorporated into these scores.",
7016
7763
  "method.s6.p1": 'The <a href="https://www.investopedia.com/terms/h/hhi.asp" target="_blank" rel="noopener noreferrer" class="text-primary underline underline-offset-2 hover:no-underline">Herfindahl\u2013Hirschman Index</a> is applied to four cuts of the portfolio: <strong>partner strategy</strong>, <strong>bet type</strong>, <strong>innovation category</strong>, and <strong>business unit</strong>.',
7017
- "method.s6.p2": "For the Scenarios page, each per-dimension HHI is mapped to a 0\u2013100 risk score using the same thresholds, then blended <strong>35 / 20 / 20 / 15</strong> (partner / bet type / innovation category / business unit) with a further <strong>10 %</strong> weight on average operational dependency. The overall reading is then lifted toward the worst single dimension (50 / 50 blend of weighted average and maximum), so a highly concentrated partner strategy alone pushes the score up even if the other dimensions look balanced. A business-unit \xD7 innovation-category cluster heatmap on the Concentration page surfaces specific over-exposed combinations beyond the aggregate.",
7764
+ "method.s6.p2": "A business-unit \xD7 innovation-category cluster heatmap on the Concentration page surfaces specific over-exposed combinations beyond the aggregate.",
7018
7765
  "concept.problem.p1": "Many organisations are pursuing innovation bets across a wide range of horizons. These initiatives often emerge from local experimentation within business units, labs or partner ecosystems rather than from a structured strategic process.",
7019
7766
  "concept.dim.value.body": "Strategic and economic potential of the innovation bet. Bets that target large, growing or under-served opportunities typically offer the greatest upside; narrow-scale or marginal-efficiency bets rarely justify the organisational effort required.",
7020
7767
  "concept.dim.feasibility.body": "Strength of evidence that the bet works. Early bets rely on directional signal; later bets need validated demand, repeatable outcomes and a credible path to scale before they can leave the lab.",
@@ -7027,13 +7774,11 @@ var EN_INNOVATION = {
7027
7774
  "scenarios.leverHelp.automationIntensity": "How aggressively the innovation portfolio is pushed from incubation into broad rollout.",
7028
7775
  "scenarios.lever.vendorDiversification": "Partner Diversification",
7029
7776
  "scenarios.leverHelp.vendorDiversification": "Spread across innovation partners (lower = more concentrated).",
7030
- "scenarios.calc.baselineNote": "Baseline is different: its five numbers are read directly from your Inventory, not from the levers. Adoption = % of active bets in Production or Scaling. Governance Load = average of governance scores (weighted with human oversight, monitoring complexity and auditability). Transformation = average of strategic sub-scores for transformation potential and operating-model alignment. Concentration Risk uses the same HHI methodology as the Concentration page: a per-dimension risk score (partner, bet type, innovation category, business unit) is derived from HHI thresholds (<1500 diversified, 1500\u20132500 moderate, >2500 highly concentrated), blended 35/20/20/15 with 10% operational dependency \u2014 and the overall reading is lifted toward the worst single dimension so a highly concentrated partner strategy alone pushes the score up. Delivery Confidence = average of feasibility scores.",
7031
- "scenarios.calc.transformation": "Transformation = 55% \xD7 Scale-up Intensity + 25% \xD7 Adoption Speed + 20% \xD7 Organisational Readiness",
7032
- "scenarios.calc.concentrationRisk": "Concentration Risk = 100 \u2212 Partner Diversification (a wider partner spread directly lowers the risk).",
7033
- "scenarios.metricHelp.concentrationRisk": "Risk from over-reliance on few innovation partners or platforms.",
7034
- "op.staffing.detailHigh": "Recommend a central innovation control function (stage-gate review, sponsor governance) with named accountability per high-governance bet.",
7035
- "op.scalability.detailHigh": "The portfolio is positioned to scale; ensure incubation, partner and operations capacity matches demand.",
7036
- "op.customer.detailHigh": "Direct customer exposure requires explicit transparency, expectation management and feedback-handling controls.",
7777
+ "scenarios.calc.baselineNote": "Baseline is different: its three numbers are read directly from your Inventory, not from the levers. Adoption = % of active bets in Production or Scaling. Transformation = average of strategic sub-scores for transformation potential and operating-model alignment. Delivery Confidence = average of feasibility scores.",
7778
+ "scenarios.calc.transformation": "Transformation = Baseline transformation + \u0394 Scale-up Intensity \xD7 0.5 + \u0394 Experiment Velocity \xD7 0.5",
7779
+ "op.governance.detailHigh": "Recommend a central innovation control function (stage-gate review, sponsor governance) with named accountability per high-governance bet.",
7780
+ "op.governance.detailMed": "Oversight is more than incidental: name a part-time owner for stage-gate review and keep review time in the delivery plan.",
7781
+ "op.delivery.detailHigh": "Data, integration and platform foundations are sound across the portfolio; ensure incubation, partner and operations capacity keeps pace.",
7037
7782
  "evaluate.field.vendor": "Partner Dependency",
7038
7783
  "evaluate.fieldHelp.vendor": "Drives the partner-concentration metric (Concentration page) and the partner-strategy bullet in the Board Memo's operating-model section. Influences the recommended posture when concentration is high.",
7039
7784
  "filters.vendor": "Partner strategy",
@@ -7076,7 +7821,7 @@ var EN_INNOVATION = {
7076
7821
  "dim.strategic.band1.label": "Incremental",
7077
7822
  "dim.strategic.band1.meaning": "Refines an existing offering only.",
7078
7823
  "dim.strategic.band3.meaning": "Opens new operating models, revenue streams or market positioning.",
7079
- "op.staffing.detailLow": "Embedded delivery teams with part-time stage-gate coverage are typically sufficient at this load.",
7824
+ "op.governance.detailLow": "Embedded delivery teams with part-time stage-gate coverage are typically sufficient at this load.",
7080
7825
  "boardPack.col.f": "E",
7081
7826
  "boardPack.col.g": "U",
7082
7827
  // ── Concept & Methodology page theming ────────────────────────────────
@@ -7084,18 +7829,18 @@ var EN_INNOVATION = {
7084
7829
  "concept.pillar.portfolio.title": "Innovation portfolio management",
7085
7830
  "concept.pillar.portfolio.b1": "Multi-dimensional scoring: value potential, validation, uncertainty, strategic fit",
7086
7831
  "concept.problem.p3": "Without a shared rubric the failure modes are predictable: <strong>pilot fatigue</strong> (many experiments, few scale-ups), <strong>redundant tooling</strong> across business units, <strong>stage-gate debt</strong> that surfaces only at review time, and <strong>zombie experiments</strong> that escape both budget and portfolio visibility.",
7087
- "concept.problem.p4": "BICon is built for the steering audience: <strong>CIO, CDO, CTO, COO</strong>, Innovation Board, Risk and Compliance \u2014 anyone who needs one reproducible portfolio view across functions, not a per-team backlog.",
7832
+ "concept.problem.p4": "BICon Portfolio Steering is built for the steering audience: <strong>CIO, CDO, CTO, COO</strong>, Innovation Board, Risk and Compliance \u2014 anyone who needs one reproducible portfolio view across functions, not a per-team backlog.",
7088
7833
  "concept.problem.p5": "Unlike classic PPM tools (Jira Portfolio, Planview, ServiceNow SPM) this console is purpose-built for AI / Digital / Innovation steering: explicit uncertainty bands, dependency-aware stage-gates and a deterministic prioritisation rule book \u2014 not generic project tasks and Gantt charts.",
7089
7834
  "concept.gettingStarted.s2.body": "For each initiative open Evaluate, set the four 0\u2013100 dimension scores with confidence, add dependencies and Stage-gate evidence. The Soft-Sync hint catches contradictions; the decision log keeps the audit trail.",
7090
7835
  "concept.gettingStarted.s3.body": "Check the Portfolio Map (Scale / Pilot / Assist / Stop), the Value-at-Stake view and the Uncertainty bands. Concentration and Operating Model surface where the portfolio is over-exposed.",
7091
- "concept.gettingStarted.s5.body": "Run Scenarios for \u221210 % / \u221220 % budget, freeze a Snapshot, then export the Executive Memo and Board Pack (PDF/PPTX) \u2014 bilingual, with the full Stage-gate section. The Board Memo and Steering KPIs surface the forward-looking budget alongside Net 3-year value so the board sees what is still allocatable.",
7836
+ "concept.gettingStarted.s5.body": "Try a \u221210 % / \u221220 % budget on Strategic Prioritisation, freeze a Snapshot, then export the Executive Memo and Board Pack (PDF/PPTX) \u2014 bilingual, with the full Stage-gate section. The Board Memo and Steering KPIs surface the forward-looking budget alongside Net 3-year value so the board sees what is still allocatable.",
7092
7837
  "concept.glossary.hhi": "<strong>HHI (Herfindahl\u2013Hirschman Index)</strong> \u2014 concentration metric. 0 = perfectly diversified, 10 000 = single dominant share. Used here on partner, solution type, innovation category and business unit cuts.",
7093
7838
  "concept.features.f5.body": "Automatic uncertainty-band assignment per initiative, plus concentration cuts by business unit and operating model. Provides early visibility on dependency on a single unit, technology or partner for risk and portfolio review.",
7094
7839
  "concept.features.f12.body": "Build any portfolio view on demand: select two axes (Value Potential, Validation, Strategic, Confidence, Budget, NPV, Y3 benefit, average score), choose what colours and sizes the bubbles, save and share the view. Designed for board-specific questions that don't fit a standard chart.",
7095
7840
  "concept.features.f13.body": "Portfolio health on one screen \u2014 funded vs. parked, score distribution, transitions at risk, uncertainty hotspots and stale gate evidence. Designed for the weekly steering meeting and standing committee reviews.",
7096
7841
  "concept.features.f17.body": "A dedicated page with HHI scores per cut, a business-unit \xD7 innovation-category cluster heatmap and drill-downs into over-exposed combinations \u2014 beyond the aggregate signal in the Uncertainty band.",
7097
7842
  "concept.features.f18.body": "Single form to score one initiative end-to-end: 0\u2013100 sliders with confidence, stage-gate roadmap, dependencies, costs, P10/P50/P90 benefit ranges \u2014 with soft-sync hints when fields contradict each other.",
7098
- "concept.features.f20.body": "Each initiative captures explicit upstream / downstream dependencies in Evaluate. The Prioritisation cut-line treats them as a hard constraint: an initiative is only funded if all its active upstream dependencies are also funded (cascade), and an Easy Experiment is automatically demoted when it depends on an upstream outside Easy Experiments. Scenarios additionally apply a dependency-aware adoption haircut when upstream work is parked.",
7843
+ "concept.features.f20.body": "Each initiative captures explicit upstream / downstream dependencies in Evaluate. The Prioritisation cut-line treats them as a hard constraint: an initiative is only funded if all its active upstream dependencies are also funded (cascade), and an Easy Experiment is automatically demoted when it depends on an upstream outside Easy Experiments.",
7099
7844
  "concept.features.f23.body": "Prioritisation thresholds, stage-gate checklists and reminder cadences are all editable in Settings \u2014 so the framework can be tuned to your portfolio without forking the code.",
7100
7845
  "concept.features.f24.body": "Self-contained demo portfolios per mode (AI / Digital / Innovation) load with realistic initiatives and dependencies \u2014 so new users can explore every view immediately without entering data.",
7101
7846
  "concept.features.f29.body": "Run the console as a multi-tenant SaaS: each organisation is an isolated tenant with its own portfolio and data. Members sign in through managed authentication and get role-based access \u2014 admin, member or viewer \u2014 refined by granular per-section permissions an admin grants from Settings, enforced on both the server and the UI. Every governance-critical and Core Metadata change is captured in a per-field audit trail with the acting user and a timestamp, and each initiative shows who created and last edited it. Cloud sync keeps the shared portfolio consistent across the team, while local (no-account) mode still works for a single user. Privileged admin actions \u2014 access grants, role and permission changes, settings, profile and initiative changes \u2014 are additionally recorded in an organisation-level admin activity log in Settings.",
@@ -7117,21 +7862,18 @@ var EN_INNOVATION = {
7117
7862
  "method.s5.uncategorised": "<strong>Unsorted Experiments</strong> (precedence 7) \u2014 fallback for initiatives that don't satisfy any of rules 1\u20136. Treat as exploratory until scores sharpen.",
7118
7863
  "method.s5.ranking": "<strong>Ranking inside the queue.</strong> Initiatives are first grouped by the category rules above (precedence 1 \u2192 7), then within each category ordered by <strong>Value Potential</strong> score descending, then \u2014 if Value-at-Stake weighting is enabled in Settings and the row sits in Easy Experiments / Scale Candidates \u2014 Year-3 benefit descending. Final tie-break is <strong>Strategic Impact</strong> descending, then name A\u2192Z, so the result is deterministic and reproducible.",
7119
7864
  "method.s10.p7": "<strong>Easy Experiment definition.</strong> The Easy Experiments category requires fast time-to-value. Therefore an Easy Experiment that depends on an active upstream outside Easy Experiments (Scale Candidate, New Operating Models, High-Uncertainty Bets etc.) is automatically demoted out of Easy Experiments \u2014 the upstream's pre-work makes it no longer quick. The rule is transitive: if A depends on B, and B is itself demoted, A is also demoted in the next iteration.",
7120
- "method.s7.p1": "Five named presets (Baseline, Accelerated Adoption, Controlled Scaling, Defensive Posture, Operating Model Transformation) plus Custom, each driven by six explicit levers: experiment velocity, stage-gate rigour, scale-up intensity, team readiness, partner diversification, coaching intensity.",
7121
- "method.s7.p2": "<strong>Baseline is special.</strong> Its slider positions are derived directly from your Inventory \u2014 experiment velocity = % of active initiatives In Production or Scaling, stage-gate rigour = average governance &amp; uncertainty score, scale-up intensity = average transformation potential, team readiness = average of organisational leverage and integration feasibility, partner diversification = 100 \u2212 partner HHI risk, coaching intensity = average human-oversight sub-score. These derived positions also act as the <strong>neutral reference</strong> for the projection.",
7122
- "method.s7.p3": "Projected outcomes are computed as transparent linear blends of the levers' <strong>delta from this Baseline</strong>, combined with structural inputs from the portfolio (production-stage share, uncertainty-load average, HHI-based concentration risk, validation average). Selecting Baseline therefore overlays Current on top of Baseline by construction; moving any slider produces an honest delta from where the portfolio actually sits today.",
7123
7865
  "method.audit.scope.governance": "<strong>Status</strong> and the four <strong>evaluation dimension scores</strong> (Value Potential, Validation &amp; Evidence, Governance &amp; Uncertainty, Strategic Impact) with their confidence.",
7124
7866
  "method.audit.scope.metadata": "<strong>All Core Metadata fields</strong> \u2014 name, business unit, owner, description, timeline, budget, partner strategy, solution type, innovation category and tags.",
7125
7867
  "method.gates.enforced.intro": "Two governance fields are enforced as hard checks when the lifecycle status changes \u2014 active because the EU AI Act module is enabled for this workspace:",
7126
7868
  "method.gates.enforced.scope": "Both checks feed the EU AI Act readiness score in addition to the hard block."
7127
7869
  };
7128
7870
  var DE_INNOVATION = {
7129
- "brand.app": "Innovations-Portfolio-Steuerung",
7130
- "brand.mobile": "BICon \xB7 Innovations-Portfolio-Steuerung",
7871
+ "brand.app": "BICon Portfolio Steering",
7872
+ "brand.mobile": "BICon Portfolio Steering",
7131
7873
  "brand.motto": "Innovation vervielfacht Chancen, aber auch Unsicherheit.",
7132
7874
  "filters.aiCategory": "Innovations-Kategorie",
7133
7875
  "evaluate.field.aiCategory": "Innovations-Kategorie",
7134
- "evaluate.fieldHelp.aiCategory": "Bestimmt die Innovations-Kategorie-Konzentration (Seite \u201EKonzentration\u201C) und den Kategorie-Mix im Vorstandsmemo. Wird au\xDFerdem zur Filterung im Inventar verwendet.",
7876
+ "evaluate.fieldHelp.aiCategory": "Bestimmt die Innovations-Kategorie-Konzentration (Seite \u201EKonzentration\u201C) und den Kategorie-Mix im Vorstandsmemo. Wird ausserdem zur Filterung im Inventar verwendet.",
7135
7877
  "category.Generative AI": "Neue Produkte",
7136
7878
  "category.Predictive AI": "Daten-Ventures",
7137
7879
  "category.Automation": "Operative Innovation",
@@ -7152,6 +7894,10 @@ var DE_INNOVATION = {
7152
7894
  "quadrant.Scale.subtitle": "Validiert \xB7 bereit zur Industrialisierung",
7153
7895
  "quadrant.Stop.subtitle": "Geringer Wert \xB7 d\xFCnne Evidenz",
7154
7896
  "quadrant.Assist.subtitle": "Vielversprechender Wert, Evidenz noch d\xFCnn",
7897
+ // Gruppenüberschriften folgen der Slider-Umbenennung: ein
7898
+ // Innovationsportfolio spricht von Evidenz, nicht von Daten/Modellen.
7899
+ "subGroup.feasibility.data": "Evidenzbasis",
7900
+ "subGroup.feasibility.solution": "Konzepteigenschaften",
7155
7901
  "sub.dataAvailability": "Evidenzbasis",
7156
7902
  "sub.dataQuality": "Qualit\xE4t der Evidenz",
7157
7903
  "sub.modelRobustness": "Robustheit des Konzepts",
@@ -7164,12 +7910,13 @@ var DE_INNOVATION = {
7164
7910
  "sub.cybersecurityExposure": "Sicherheits- & IP-Exposition",
7165
7911
  "sub.innovationCapability": "Aufbau von Innovationsmuskeln",
7166
7912
  "subHelp.dataAvailability": "Wie viel Evidenz (Daten, Stand der Technik, Prototypen) die Idee bereits st\xFCtzt.",
7167
- "subHelp.dataQuality": "Belastbarkeit dieser Evidenz \u2014 Rigorosit\xE4t, Stichprobengr\xF6\xDFe, Unabh\xE4ngigkeit, Aktualit\xE4t.",
7913
+ "subHelp.dataQuality": "Belastbarkeit dieser Evidenz \u2014 Rigorosit\xE4t, Stichprobengr\xF6sse, Unabh\xE4ngigkeit, Aktualit\xE4t.",
7168
7914
  "dim.feasibility.band1.meaning": "L\xFCcken bei Konzept, F\xE4higkeiten oder Partnern machen die Umsetzung unsicher.",
7169
7915
  "govBand.Elevated.desc": "41\u201360 \xB7 Gegateter Pilot \u2014 Standard-Stage-Gate-Kontrollen",
7170
7916
  "govLabel.Controlled Automation": "\xDCberwachte Erprobung",
7171
7917
  "govLabel.Human-in-the-Loop Required": "Aktive Begleitung erforderlich",
7172
7918
  "govLabel.Restricted Deployment": "Nur eingegrenzter Pilot",
7919
+ "memo.governance.intro": "{count} Initiativen liegen im Band \u201ENur eingegrenzter Pilot\u201C oder dar\xFCber (Governance \u2265 61/100) und ben\xF6tigen aktive Vorstandsaufsicht.",
7173
7920
  "govLabel.High Governance Sensitivity": "Vorstandspatenschaft erforderlich",
7174
7921
  "subHelp.modelRobustness": "Wie gut das Kernkonzept Belastung, Edge-Cases und pessimistische Annahmen aush\xE4lt.",
7175
7922
  "subHelp.reproducibility": "Wahrscheinlichkeit, dass beobachtete Ergebnisse unter unabh\xE4ngigen Bedingungen wiederholbar sind.",
@@ -7181,13 +7928,7 @@ var DE_INNOVATION = {
7181
7928
  "subHelp.cybersecurityExposure": "Exposition vertraulicher Daten, IP und Partnerbeziehungen durch die Arbeit.",
7182
7929
  "subHelp.innovationCapability": "Aufbau von Innovationsmuskeln \u2014 Talente, Methoden, Partnerschaften, wiederverwendbares IP.",
7183
7930
  "scenarios.lever.adoptionSpeed": "Experiment-Tempo",
7184
- "scenarios.lever.governanceStrictness": "Stage-Gate-Rigorosit\xE4t",
7185
- "scenarios.lever.organisationalReadiness": "Team-Reife",
7186
- "scenarios.lever.oversightIntensity": "Coaching-Intensit\xE4t",
7187
7931
  "scenarios.leverHelp.adoptionSpeed": "Wie schnell Ideen durch Erproben \u2192 Validieren \u2192 Skalieren wandern.",
7188
- "scenarios.leverHelp.governanceStrictness": "Wie streng Stage-Gate-Reviews, Evidenzschwellen und Kill-Kriterien sind.",
7189
- "scenarios.leverHelp.organisationalReadiness": "Innovations-Skills, Sponsor-Unterst\xFCtzung und Aufnahmef\xE4higkeit des operativen Gesch\xE4fts.",
7190
- "scenarios.leverHelp.oversightIntensity": "Aktives Coaching, Mentoring und Stakeholder-Review rund um Innovationsteams.",
7191
7932
  "prioritisation.cat.Quick Wins": "Einfache Experimente",
7192
7933
  "prioritisation.cat.Strategic Core Initiatives": "Skalierungs-Kandidaten",
7193
7934
  "prioritisation.cat.High Governance Risk": "Hochunsichere Wetten",
@@ -7205,7 +7946,7 @@ var DE_INNOVATION = {
7205
7946
  "settings.prio.operatingModel": "Neue Betriebsmodelle",
7206
7947
  "settings.prio.subtitle": "Schwellenwerte, mit denen die Priorisierungsseite jede Innovationsinitiative einem strategischen Archetyp zuordnet. Die Regeln werden von oben nach unten gepr\xFCft, die erste \xDCbereinstimmung gewinnt. Alle Werte sind Punkte von 0\u2013100 \xFCber die vier Dimensionen: W = Wertpotenzial, E = Validierung & Evidenz, U = Governance & Unsicherheit, S = Strategischer Impact.",
7207
7948
  "inventory.col.scores": "Punkte (W/E/U/S)",
7208
- "concept.eyebrow": "Innovations-Portfolio-Steuerung",
7949
+ "concept.eyebrow": "Steuerung von KI-, Digital- und Transformationsportfolios",
7209
7950
  "concept.title": "Verstreute Experimente in ein gesteuertes Innovationsportfolio \xFCberf\xFChren.",
7210
7951
  "concept.lead": "Innovationsinitiativen schaffen nur dann Wert, wenn sie systematisch priorisiert, gesteuert und skaliert werden. Diese Konsole hilft Vorst\xE4nden und Innovationsaussch\xFCssen zu entscheiden, welche Experimente skaliert, welche weiter inkubiert und welche beendet werden sollten.",
7211
7952
  "concept.quote": "Innovationsinitiativen sind nicht als isolierte Wetten zu betrachten, sondern als gesteuertes Portfolio von Optionen \u2014 bewertet entlang eines einheitlichen Satzes von Dimensionen, die sowohl potenziellen Wert als auch verbleibende Unsicherheit erfassen.",
@@ -7240,8 +7981,6 @@ var DE_INNOVATION = {
7240
7981
  "portfolio.axis.y": "Validierung & Evidenz",
7241
7982
  "portfolio.tooltip.valueScale": "Wertpotenzial",
7242
7983
  "portfolio.tooltip.feasibility": "Validierung",
7243
- "op.input.value": "Wertpotenzial",
7244
- "op.input.feasibility": "Validierung",
7245
7984
  "evaluate.profile.radarValue": "Potenzial",
7246
7985
  "evaluate.profile.radarFeasibility": "Validierung",
7247
7986
  "concept.dim.value.title": "1. Wertpotenzial",
@@ -7249,9 +7988,9 @@ var DE_INNOVATION = {
7249
7988
  "inventory.subtitle": "Verwalten und bewerten Sie Ihr Portfolio an Innovationsinitiativen.",
7250
7989
  "inventory.empty.title": "Innovation vervielfacht Chancen, aber auch Unsicherheit.",
7251
7990
  "inventory.empty.subtitle": "F\xFCgen Sie zuerst Ihre Innovationsinitiativen dem Portfolio hinzu, oder laden Sie den strategischen Demodatensatz, um die Bewertungsrahmen zu erkunden.",
7252
- "memo.summary.portfolio": "Das Unternehmen f\xFChrt aktuell {count} aktive Innovationsinitiativen mit einem zugesagten Gesamtbudget von {budget}.",
7991
+ "memo.summary.portfolio": "Das Unternehmen f\xFChrt aktuell {count} aktive Innovationsinitiativen mit einem zugesagten Budget von {budget} (ab {stPilot}).",
7253
7992
  "governance.subtitle": "F\xFChrungsaufsicht \xFCber Innovationswetten, Stage-Gate-Haltung und Unsicherheits-Exposition.",
7254
- "op.subtitle": "Organisatorische Implikationen des aktuellen Innovationsportfolios \xFCber Staffing, Governance, Skalierbarkeit, Partnerschaften und Betriebsmodell-Entwicklung.",
7993
+ "op.subtitle": "Organisatorische Implikationen des aktuellen Innovationsportfolios: welche Governance-Arbeit es erzeugt, wie viel des Gesch\xE4fts inzwischen daran h\xE4ngt, wie lieferbereit es ist, ob es Mengen verkraftet, wie stark es das Betriebsmodell verschiebt, wie viel Arbeit es automatisiert und wie weit es fortgeschritten ist.",
7255
7994
  "concentration.subtitle": "Systemische Exposition \xFCber Partnerstrategie, Innovations-Kategorie, Gesch\xE4ftseinheit und Unsicherheits-Band erkennen. HHI-Schwellen: <1500 diversifiziert, 1500\u20132500 moderat, >2500 hoch konzentriert.",
7256
7995
  "concentration.hhi.category": "Innovations-Kategorie",
7257
7996
  "concentration.heatmap.title": "Cluster-Heatmap \u2014 Gesch\xE4ftseinheit \xD7 Innovations-Kategorie",
@@ -7262,9 +8001,9 @@ var DE_INNOVATION = {
7262
8001
  "boardPack.heatmap.subtitle": "Gesch\xE4ftseinheit \xD7 Innovations-Kategorie \u2014 Cluster, in denen eine GE ein Innovationsthema b\xFCndelt.",
7263
8002
  "portfolio.custom.metric.valueScale": "Wertpotenzial",
7264
8003
  "portfolio.custom.metric.feasibility": "Validierung",
7265
- "subHelp.operationalLeverage": "Wie stark die Innovation den Output pro menschlicher Arbeitseinheit multipliziert. H\xF6her = gr\xF6\xDFere operative Reichweite pro FTE.",
7266
- "op.staffing.level3": "Dedizierte Innovations-Kontrollfunktion",
7267
- "scenarios.subtitle": "Ein What-if-Werkzeug: eine strategische Haltung w\xE4hlen, die Regler bewegen und sehen, wie sich f\xFCnf Portfolio-Kennzahlen ver\xE4ndern. Alles wird live aus den Reglern berechnet \u2014 keine Prognose.",
8004
+ "subHelp.operationalLeverage": "Wie stark die Innovation den Output pro menschlicher Arbeitseinheit multipliziert. H\xF6her = gr\xF6ssere operative Reichweite pro FTE.",
8005
+ "op.governance.level3": "Dedizierte Innovations-Kontrollfunktion",
8006
+ "scenarios.subtitle": "Ein What-if-Werkzeug: eine strategische Haltung w\xE4hlen, die Regler bewegen und sehen, wie sich drei Portfolio-Kennzahlen ver\xE4ndern. Alles wird live aus den Reglern berechnet \u2014 keine Prognose.",
7268
8007
  "scenarios.preset.transformational.desc": "Betriebsmodell um Innovation neu gestalten; hohe Reife und diversifizierte Partnerbasis.",
7269
8008
  "memo.heading": "Vorstandsmemo \u2014 Innovations-Portfolio",
7270
8009
  "memo.concentration.category": "Innovations-Kategoriekonzentration: {name} stellt {count} von {total} Initiativen ({pct}%).",
@@ -7284,31 +8023,28 @@ var DE_INNOVATION = {
7284
8023
  "method.s4.assist": "<strong>Inkubieren</strong> \u2014 Business Impact \u2265 50 und Validierung &lt; 50. Vielversprechend, aber unbewiesen \u2014 in der Inkubation belassen, weitere Evidenz sammeln.",
7285
8024
  "method.s4.pilot": "<strong>Erproben</strong> \u2014 Business Impact &lt; 50 und Validierung \u2265 50. Validiert, aber unklarer strategischer Ertrag \u2014 angrenzende Anwendungen erproben, bevor committet wird.",
7286
8025
  "method.s4.stop": "<strong>Beenden</strong> \u2014 Business Impact &lt; 50 und Validierung &lt; 50. Geringer Impact und schwache Evidenz \u2014 beenden oder Erkenntnisse weiterverwerten.",
7287
- "method.s4.bubbles": "Die Blasengr\xF6\xDFe betont zus\xE4tzlich den strategischen Impact f\xFCr sich (eine strategische Wette erscheint also gr\xF6\xDFer, selbst wenn ihr Wert-Score moderat ist); die Farbe spiegelt das Unsicherheits-Band wider.",
8026
+ "method.s4.bubbles": "Die Blasengr\xF6sse betont zus\xE4tzlich den strategischen Impact f\xFCr sich (eine strategische Wette erscheint also gr\xF6sser, selbst wenn ihr Wert-Score moderat ist); die Farbe spiegelt das Unsicherheits-Band wider.",
7288
8027
  "method.s5.governance": "<strong>Hochunsichere Wetten</strong> (Pr\xE4zedenz 3) \u2014 Governance- & Unsicherheits-Wert \u2265 {g} (und die Wette wurde nicht bereits als Quick Wins oder Strategische Kernwette klassifiziert). Erh\xF6hte strategische, Markt- oder Ausf\xFChrungsunsicherheit, die vor einer Skalierung durch Stage-Gating reduziert werden muss.",
7289
- "method.s8.b3": "Es werden keine externen regulatorischen, Peer-Review- oder Drittparteien-Signale ber\xFCcksichtigt.",
7290
8028
  "memo.assumptions.signals": "Es wurden keine externen regulatorischen, Peer-Review- oder Drittparteien-Signale in diese Scores einbezogen.",
7291
8029
  "method.s6.p1": 'Der <a href="https://www.investopedia.com/terms/h/hhi.asp" target="_blank" rel="noopener noreferrer" class="text-primary underline underline-offset-2 hover:no-underline">Herfindahl\u2013Hirschman-Index</a> wird auf vier Schnitte angewendet: <strong>Partnerstrategie</strong>, <strong>Wettentyp</strong>, <strong>Innovations-Kategorie</strong> und <strong>Gesch\xE4ftseinheit</strong>.',
7292
- "method.s6.p2": "F\xFCr die Szenarien-Seite wird jeder dimensionale HHI mit denselben Schwellenwerten auf einen Risikowert 0\u2013100 abgebildet und anschlie\xDFend zu <strong>35 / 20 / 20 / 15</strong> (Partner / Wettentyp / Innovations-Kategorie / Gesch\xE4ftseinheit) gewichtet, plus weiteren <strong>10 %</strong> f\xFCr die durchschnittliche operative Abh\xE4ngigkeit. Der Gesamtwert wird dann in Richtung der schlechtesten Einzeldimension angehoben (50 / 50-Mischung aus gewichtetem Durchschnitt und Maximum), sodass z. B. eine hoch konzentrierte Partnerstrategie allein den Score nach oben zieht \u2013 auch wenn die \xFCbrigen Dimensionen ausgewogen wirken. Eine Gesch\xE4ftseinheit-\xD7-Innovations-Kategorie-Heatmap auf der Konzentrations-Seite deckt dar\xFCber hinaus spezifische \xFCberexponierte Kombinationen jenseits des Aggregats auf.",
8030
+ "method.s6.p2": "Eine Gesch\xE4ftseinheit-\xD7-Innovations-Kategorie-Heatmap auf der Konzentrations-Seite deckt dar\xFCber hinaus spezifische \xFCberexponierte Kombinationen jenseits des Aggregats auf.",
7293
8031
  "concept.problem.p1": "Viele Organisationen verfolgen Innovationswetten \xFCber unterschiedliche Horizonte hinweg. Diese Initiativen entstehen h\xE4ufig aus lokalen Experimenten in Gesch\xE4ftseinheiten, Labs oder Partner-\xD6kosystemen \u2013 nicht aus einem strukturierten strategischen Prozess.",
7294
- "concept.dim.value.body": "Strategisches und \xF6konomisches Potenzial der Innovationswette. Wetten auf gro\xDFe, wachsende oder unterversorgte Chancen bieten das gr\xF6\xDFte Upside; Wetten mit begrenztem Volumen oder marginalen Effizienzgewinnen rechtfertigen den organisatorischen Aufwand selten.",
8032
+ "concept.dim.value.body": "Strategisches und \xF6konomisches Potenzial der Innovationswette. Wetten auf grosse, wachsende oder unterversorgte Chancen bieten das gr\xF6sste Upside; Wetten mit begrenztem Volumen oder marginalen Effizienzgewinnen rechtfertigen den organisatorischen Aufwand selten.",
7295
8033
  "concept.dim.feasibility.body": "St\xE4rke der Evidenz, dass die Wette funktioniert. Fr\xFChe Wetten st\xFCtzen sich auf Indikatoren; sp\xE4tere Wetten ben\xF6tigen validierte Nachfrage, wiederholbare Ergebnisse und einen glaubw\xFCrdigen Skalierungspfad, bevor sie das Lab verlassen k\xF6nnen.",
7296
8034
  "concept.dim.feasibility.q1": "Liegt ausreichend Evidenz vor (Signale, Prototypen, Pilotprojekte), dass die Wette funktioniert?",
7297
8035
  "concept.dim.feasibility.q2": "Sind die Ergebnisse \xFCber Kunden, Segmente oder Kontexte hinweg wiederholbar?",
7298
8036
  "concept.dim.feasibility.q3": "Lassen sich die zugrundeliegenden Annahmen g\xFCnstig testen und falsifizieren?",
7299
8037
  "concept.dim.governance.body": "Innovationswetten bringen neue Formen strategischer, marktbezogener und reputativer Unsicherheit mit sich. Governance bestimmt, wie Wetten getaktet, \xFCberwacht und begrenzt werden \u2013 ob sie skalieren d\xFCrfen, in Inkubation bleiben m\xFCssen oder beendet werden sollen.",
7300
- "concept.dim.governance.q1": "Wie gro\xDF ist der Worst-Case-Effekt, falls die Wette scheitert oder die zugrundeliegende Annahme falsch ist?",
8038
+ "concept.dim.governance.q1": "Wie gross ist der Worst-Case-Effekt, falls die Wette scheitert oder die zugrundeliegende Annahme falsch ist?",
7301
8039
  "scenarios.lever.automationIntensity": "Skalierungs\xADintensit\xE4t",
7302
8040
  "scenarios.leverHelp.automationIntensity": "Wie offensiv das Innovationsportfolio aus der Inkubation in den breiten Rollout getrieben wird.",
7303
8041
  "scenarios.lever.vendorDiversification": "Partnerdiversifizierung",
7304
8042
  "scenarios.leverHelp.vendorDiversification": "Streuung \xFCber Innovationspartner (niedriger = konzentrierter).",
7305
- "scenarios.calc.baselineNote": "Baseline ist anders: die f\xFCnf Kennzahlen werden direkt aus dem Inventar gelesen, nicht aus den Reglern. Adoption = Anteil aktiver Wetten in Production oder Scaling. Governance-Last = Durchschnitt der Governance-Scores (gewichtet mit menschlicher Aufsicht, Monitoring-Komplexit\xE4t und Auditierbarkeit). Transformation = Durchschnitt der strategischen Sub-Scores f\xFCr Transformationspotenzial und Betriebsmodell-Ausrichtung. Konzentrationsrisiko nutzt dieselbe HHI-Methodik wie die Konzentrations-Seite: pro Dimension (Partner, Wettentyp, Innovations-Kategorie, Gesch\xE4ftsbereich) wird aus dem HHI ein Risikowert abgeleitet (<1500 diversifiziert, 1500\u20132500 moderat, >2500 hoch konzentriert), gewichtet zu 35/20/20/15 mit 10 % operativer Abh\xE4ngigkeit \u2014 und der Gesamtwert wird in Richtung der schlechtesten Einzeldimension angehoben, sodass z. B. eine hoch konzentrierte Partnerstrategie allein den Score nach oben zieht. Liefervertrauen = Durchschnitt der Feasibility-Scores.",
7306
- "scenarios.calc.transformation": "Transformation = 55 % \xD7 Skalierungsintensit\xE4t + 25 % \xD7 Einf\xFChrungstempo + 20 % \xD7 organisatorische Reife",
7307
- "scenarios.calc.concentrationRisk": "Konzentrationsrisiko = 100 \u2212 Partnerdiversifizierung (eine breitere Streuung senkt das Risiko direkt).",
7308
- "scenarios.metricHelp.concentrationRisk": "Risiko aus Abh\xE4ngigkeit von wenigen Innovationspartnern oder Plattformen.",
7309
- "op.staffing.detailHigh": "Empfehlung: zentrale Innovations-Kontrollfunktion (Stage-Gate-Review, Sponsor-Governance) mit benannter Verantwortung pro Wette mit hoher Governance.",
7310
- "op.scalability.detailHigh": "Das Portfolio ist auf Skalierung ausgelegt; Inkubations-, Partner- und Betriebskapazit\xE4t muss zur Nachfrage passen.",
7311
- "op.customer.detailHigh": "Direkter Kundenkontakt erfordert explizite Transparenz-, Erwartungsmanagement- und Feedback-Handling-Kontrollen.",
8043
+ "scenarios.calc.baselineNote": "Baseline ist anders: die drei Kennzahlen werden direkt aus dem Inventar gelesen, nicht aus den Reglern. Adoption = Anteil aktiver Wetten in Production oder Scaling. Transformation = Durchschnitt der strategischen Sub-Scores f\xFCr Transformationspotenzial und Betriebsmodell-Ausrichtung. Liefervertrauen = Durchschnitt der Feasibility-Scores.",
8044
+ "scenarios.calc.transformation": "Transformation = Baseline-Transformation + \u0394 Skalierungsintensit\xE4t \xD7 0,5 + \u0394 Experiment-Tempo \xD7 0,5",
8045
+ "op.governance.detailHigh": "Empfehlung: zentrale Innovations-Kontrollfunktion (Stage-Gate-Review, Sponsor-Governance) mit benannter Verantwortung pro Wette mit hoher Governance.",
8046
+ "op.governance.detailMed": "Die Aufsicht ist mehr als nebenbei zu leisten: Benennen Sie eine Teilzeit-Verantwortung f\xFCr Stage-Gate-Reviews und planen Sie Pr\xFCfzeit fest ein.",
8047
+ "op.delivery.detailHigh": "Daten-, Integrations- und Plattformgrundlagen tragen portfolioweit; Inkubations-, Partner- und Betriebskapazit\xE4t mitwachsen lassen.",
7312
8048
  "evaluate.field.vendor": "Partner-Abh\xE4ngigkeit",
7313
8049
  "evaluate.fieldHelp.vendor": "Bestimmt die Partnerkonzentrations-Kennzahl (Konzentrations-Seite) und den Partnerstrategie-Punkt im Betriebsmodell-Abschnitt des Board-Memos. Beeinflusst die empfohlene Haltung bei hoher Konzentration.",
7314
8050
  "filters.vendor": "Partnerstrategie",
@@ -7326,7 +8062,7 @@ var DE_INNOVATION = {
7326
8062
  "vendor.Multi-Vendor": "Mehrere Partner",
7327
8063
  "vendor.Internal Build": "Eigenentwicklung",
7328
8064
  "vendor.Hybrid": "Hybrid",
7329
- "dim.valueScale.intro": "Bewerten Sie das strategische und \xF6konomische Upside dieser Innovationswette \u2014 wie gro\xDF die Chance ist und wie breit sie \xFCber ein einzelnes Experiment hinaus skalieren k\xF6nnte. H\xF6here Werte bedeuten substanzielles, wiederholbares Potenzial statt eines Nischen- oder Einzelergebnisses.",
8065
+ "dim.valueScale.intro": "Bewerten Sie das strategische und \xF6konomische Upside dieser Innovationswette \u2014 wie gross die Chance ist und wie breit sie \xFCber ein einzelnes Experiment hinaus skalieren k\xF6nnte. H\xF6here Werte bedeuten substanzielles, wiederholbares Potenzial statt eines Nischen- oder Einzelergebnisses.",
7330
8066
  "dim.feasibility.intro": "Bewerten Sie die St\xE4rke der Evidenz, dass die Wette funktioniert \u2013 basierend auf heutigen Signalen, Prototypen und Validierung. Fr\xFChe Wetten st\xFCtzen sich auf Indikatoren; h\xF6here Werte bedeuten wiederholbare Ergebnisse, pr\xFCfbare Annahmen und einen glaubw\xFCrdigen Pfad aus dem Lab.",
7331
8067
  "dim.governance.intro": "Bewerten Sie strategische, marktbezogene, regulatorische und reputative Unsicherheit rund um die Wette. H\xF6here Werte bedeuten MEHR Unsicherheit und eine h\xF6here Stage-Gate- und Stop-Loss-Last \u2014 also ob die Wette skalieren darf, in Inkubation bleiben muss oder bei nicht haltbaren Annahmen beendet werden sollte.",
7332
8068
  "dim.strategic.intro": "Bewerten Sie den Beitrag zu neuen strategischen F\xE4higkeiten, Betriebsmodellen oder Marktpositionierungen. H\xF6here Werte bedeuten, dass die Wette neue Erl\xF6sstr\xF6me er\xF6ffnen oder das Wettbewerbsverhalten der Organisation neu pr\xE4gen k\xF6nnte \u2014 \xFCber die Verfeinerung eines bestehenden Angebots hinaus.",
@@ -7335,13 +8071,13 @@ var DE_INNOVATION = {
7335
8071
  "dim.valueScale.band2.label": "Gezielte Wette",
7336
8072
  "dim.valueScale.band2.meaning": "Relevant innerhalb einer Gesch\xE4ftseinheit, aber noch nicht portfolio-pr\xE4gend.",
7337
8073
  "dim.valueScale.band3.label": "Strategische Wette",
7338
- "dim.valueScale.band3.meaning": "Gro\xDFes, wiederholbares Upside organisationsweit; ben\xF6tigt Vorstandsunterst\xFCtzung.",
8074
+ "dim.valueScale.band3.meaning": "Grosses, wiederholbares Upside organisationsweit; ben\xF6tigt Vorstandsunterst\xFCtzung.",
7339
8075
  "dim.feasibility.band2.label": "Validieren mit Vorbehalt",
7340
8076
  "dim.feasibility.band2.meaning": "Vielversprechend, erfordert aber weitere Evidenz, Prototypen oder Partnerf\xE4higkeit.",
7341
8077
  "dim.feasibility.band3.label": "Bereit zur Skalierung",
7342
8078
  "dim.feasibility.band3.meaning": "Evidenz, F\xE4higkeit und ein glaubw\xFCrdiger Skalierungspfad sind vorhanden.",
7343
8079
  "dim.governance.band1.label": "Geringe Unsicherheit",
7344
- "dim.governance.band1.meaning": "Routinem\xE4\xDFige Stage-Gate-Checkpoints; keine Eskalation erforderlich.",
8080
+ "dim.governance.band1.meaning": "Routinem\xE4ssige Stage-Gate-Checkpoints; keine Eskalation erforderlich.",
7345
8081
  "dim.governance.band2.label": "Gegateter Pilot",
7346
8082
  "dim.governance.band2.meaning": "Standard Stage-Gate-Kontrollen und Fortschrittsmonitoring erforderlich.",
7347
8083
  "dim.governance.band3.label": "Enges Stage-Gating",
@@ -7351,7 +8087,7 @@ var DE_INNOVATION = {
7351
8087
  "dim.strategic.band1.label": "Inkrementell",
7352
8088
  "dim.strategic.band1.meaning": "Verfeinert nur ein bestehendes Angebot.",
7353
8089
  "dim.strategic.band3.meaning": "Er\xF6ffnet neue Betriebsmodelle, Erl\xF6sstr\xF6me oder Marktpositionierungen.",
7354
- "op.staffing.detailLow": "Eingebettete Teams mit teilweiser Stage-Gate-Abdeckung reichen bei dieser Last meist aus.",
8090
+ "op.governance.detailLow": "Eingebettete Teams mit teilweiser Stage-Gate-Abdeckung reichen bei dieser Last meist aus.",
7355
8091
  "boardPack.col.f": "E",
7356
8092
  "boardPack.col.g": "U",
7357
8093
  // ── Concept & Methodology page theming ────────────────────────────────
@@ -7359,22 +8095,22 @@ var DE_INNOVATION = {
7359
8095
  "concept.pillar.portfolio.title": "Innovations-Portfoliomanagement",
7360
8096
  "concept.pillar.portfolio.b1": "Mehrdimensionales Scoring: Wertpotenzial, Validierung, Unsicherheit, strategischer Fit",
7361
8097
  "concept.problem.p3": "Ohne gemeinsame Bewertungsbasis sind die typischen Fehlermuster vorhersehbar: <strong>Piloten-M\xFCdigkeit</strong> (viele Experimente, wenige Skalierungen), <strong>redundante Werkzeuge</strong> \xFCber Gesch\xE4ftseinheiten hinweg, <strong>Stage-Gate-Schulden</strong>, die erst im Review sichtbar werden, und <strong>Zombie-Experimente</strong>, die weder Budget- noch Portfoliosicht erreichen.",
7362
- "concept.problem.p4": "BICon ist f\xFCr das Steering-Publikum gebaut: <strong>CIO, CDO, CTO, COO</strong>, Innovation Board, Risk und Compliance \u2014 alle, die eine reproduzierbare Portfolio-Sicht \xFCber Funktionen hinweg brauchen, kein Team-Backlog.",
8098
+ "concept.problem.p4": "BICon Portfolio Steering ist f\xFCr das Steering-Publikum gebaut: <strong>CIO, CDO, CTO, COO</strong>, Innovation Board, Risk und Compliance \u2014 alle, die eine reproduzierbare Portfolio-Sicht \xFCber Funktionen hinweg brauchen, kein Team-Backlog.",
7363
8099
  "concept.problem.p5": "Anders als klassische PPM-Werkzeuge (Jira Portfolio, Planview, ServiceNow SPM) ist diese Konsole gezielt f\xFCr KI- / Digital- / Innovations-Steuerung gebaut: explizite Unsicherheits-B\xE4nder, abh\xE4ngigkeitsbewusste Stage-Gates und ein deterministisches Priorisierungs-Regelwerk \u2014 keine generischen Projektaufgaben und Gantt-Charts.",
7364
8100
  "concept.gettingStarted.s2.body": "Je Initiative die Evaluate-Maske \xF6ffnen, die vier 0\u2013100-Dimensionsscores mit Konfidenz setzen, Abh\xE4ngigkeiten und Stage-Gate-Evidenz erg\xE4nzen. Der Soft-Sync-Hinweis f\xE4ngt Widerspr\xFCche, das Entscheidungsprotokoll h\xE4lt den Audit-Trail fest.",
7365
8101
  "concept.gettingStarted.s3.body": "Portfolio-Karte (Scale / Pilot / Assist / Stop), Value-at-Stake-Sicht und Unsicherheits-B\xE4nder pr\xFCfen. Konzentration und Operating Model zeigen, wo das Portfolio \xFCberexponiert ist.",
7366
- "concept.gettingStarted.s5.body": "Szenarien f\xFCr \u221210 % / \u221220 % Budget rechnen, einen Snapshot einfrieren, dann Executive Memo und Board Pack (PDF/PPTX) exportieren \u2014 zweisprachig, mit voller Stage-Gate-Sektion. Board Memo und Steering-KPIs zeigen das vorausschauende Budget neben dem Netto-3-Jahres-Wert, damit das Gremium sieht, was noch alloziierbar ist.",
7367
- "concept.glossary.hhi": "<strong>HHI (Herfindahl\u2013Hirschman-Index)</strong> \u2014 Konzentrationsma\xDF. 0 = vollst\xE4ndig diversifiziert, 10 000 = ein dominanter Anteil. Hier auf Partner, L\xF6sungstyp, Innovations-Kategorie und Gesch\xE4ftseinheit angewendet.",
8102
+ "concept.gettingStarted.s5.body": "Ein Budget von \u221210 % / \u221220 % in der Strategischen Priorisierung durchspielen, einen Snapshot einfrieren, dann Executive Memo und Board Pack (PDF/PPTX) exportieren \u2014 zweisprachig, mit voller Stage-Gate-Sektion. Board Memo und Steering-KPIs zeigen das vorausschauende Budget neben dem Netto-3-Jahres-Wert, damit das Gremium sieht, was noch alloziierbar ist.",
8103
+ "concept.glossary.hhi": "<strong>HHI (Herfindahl\u2013Hirschman-Index)</strong> \u2014 Konzentrationsmass. 0 = vollst\xE4ndig diversifiziert, 10 000 = ein dominanter Anteil. Hier auf Partner, L\xF6sungstyp, Innovations-Kategorie und Gesch\xE4ftseinheit angewendet.",
7368
8104
  "concept.features.f5.body": "Automatische Zuordnung eines Unsicherheits-Bands je Initiative, plus Konzentrations-Schnitte nach Gesch\xE4ftseinheit und Betriebsmodell. Liefert fr\xFChzeitige Sichtbarkeit auf Abh\xE4ngigkeiten von einer Einheit, einer Technologie oder einem Partner f\xFCr Risiko- und Portfolio-Reviews.",
7369
8105
  "concept.features.f12.body": "Jede Portfolio-Sicht bedarfsgerecht bauen: zwei Achsen w\xE4hlen (Wertpotenzial, Validierung, Strategisch, Konfidenz, Budget, NPV, Y3-Nutzen, Durchschnitts-Score), bestimmen, was Blasen einf\xE4rbt und skaliert, Sicht speichern und teilen. Konzipiert f\xFCr vorstandsspezifische Fragestellungen jenseits der Standard-Diagramme.",
7370
8106
  "concept.features.f13.body": "Portfolio-Gesundheit auf einem Bildschirm \u2014 gef\xF6rdert vs. zur\xFCckgestellt, Bewertungs-Verteilung, Transitions at Risk, Unsicherheits-Hotspots und veraltete Gate-Nachweise. Konzipiert f\xFCr das w\xF6chentliche Steering und stehende Gremien-Reviews.",
7371
8107
  "concept.features.f17.body": "Eigene Seite mit HHI-Scores pro Schnitt, einer Gesch\xE4ftseinheit-\xD7-Innovations-Kategorie-Heatmap und Drill-downs in \xFCberexponierte Kombinationen \u2014 \xFCber das Aggregat-Signal aus den Unsicherheits-B\xE4ndern hinaus.",
7372
8108
  "concept.features.f18.body": "Eine Maske, um eine Initiative durchg\xE4ngig zu bewerten: 0\u2013100-Slider mit Konfidenz, Stage-Gate-Roadmap, Abh\xE4ngigkeiten, Kosten, P10/P50/P90-Nutzenbandbreiten \u2014 mit Soft-Sync-Hinweisen bei widerspr\xFCchlichen Feldern.",
7373
- "concept.features.f20.body": "Jede Initiative erfasst in Evaluate explizit Vor- und Nachgelagertes. Die Priorisierungs-Schnittlinie behandelt sie als harte Bedingung: Eine Initiative wird nur gef\xF6rdert, wenn alle ihre aktiven vorgelagerten Abh\xE4ngigkeiten ebenfalls gef\xF6rdert sind (Kaskade); ein Einfaches Experiment wird automatisch demotet, sobald es von etwas au\xDFerhalb der Einfachen Experimente abh\xE4ngt. Szenarien wenden zus\xE4tzlich einen abh\xE4ngigkeitsbewussten Einf\xFChrungs-Abschlag an, wenn Vorgelagertes zur\xFCckgestellt wird.",
8109
+ "concept.features.f20.body": "Jede Initiative erfasst in Evaluate explizit Vor- und Nachgelagertes. Die Priorisierungs-Schnittlinie behandelt sie als harte Bedingung: Eine Initiative wird nur gef\xF6rdert, wenn alle ihre aktiven vorgelagerten Abh\xE4ngigkeiten ebenfalls gef\xF6rdert sind (Kaskade); ein Einfaches Experiment wird automatisch demotet, sobald es von etwas ausserhalb der Einfachen Experimente abh\xE4ngt.",
7374
8110
  "concept.features.f23.body": "Priorisierungs-Schwellen, Stage-Gate-Checklisten und Reminder-Kadenzen sind alle in den Einstellungen editierbar \u2014 so l\xE4sst sich das Framework an Ihr Portfolio anpassen, ohne den Code zu forken.",
7375
8111
  "concept.features.f24.body": "In sich geschlossene Demo-Portfolios pro Modus (KI / Digital / Innovation) laden mit realistischen Initiativen und Abh\xE4ngigkeiten \u2014 sodass neue Nutzer jede Sicht sofort erkunden k\xF6nnen, ohne Daten einzugeben.",
7376
8112
  "concept.features.f29.body": "Die Konsole l\xE4uft als mandantenf\xE4hige SaaS: Jede Organisation ist ein isolierter Mandant mit eigenem Portfolio und eigenen Daten. Mitglieder melden sich \xFCber eine verwaltete Authentifizierung an und erhalten rollenbasierten Zugriff \u2014 Admin, Mitglied oder Betrachter \u2014 verfeinert durch granulare Berechtigungen pro Bereich, die ein Admin in den Einstellungen vergibt und die serverseitig wie auch in der Oberfl\xE4che durchgesetzt werden. Jede governance-kritische und Kern-Metadaten-\xC4nderung wird in einem feldgenauen Audit-Trail mit handelndem Benutzer und Zeitstempel erfasst, und jede Initiative zeigt, wer sie erstellt und zuletzt bearbeitet hat. Cloud-Sync h\xE4lt das gemeinsame Portfolio im Team konsistent, w\xE4hrend der lokale Modus (ohne Konto) weiterhin f\xFCr einen einzelnen Nutzer funktioniert. Privilegierte Admin-Aktionen \u2014 Zugriffsvergaben, Rollen- und Rechte\xE4nderungen, \xC4nderungen an Einstellungen, Profilen und Initiativen \u2014 werden zus\xE4tzlich in einem Admin-Aktivit\xE4tsprotokoll auf Organisationsebene in den Einstellungen erfasst.",
7377
- "concept.features.f30.body": "Eine regelbasierte, nach Dringlichkeit sortierte Liste der Entscheidungen, die die Portfoliodaten selbst einfordern: Stopp-/Aufschub-Kandidaten, Gate-Disziplin, Kapazit\xE4ts- und Budgetengp\xE4sse sowie Konzentration. Nutzenrealisierungs-Regeln markieren Produktionssysteme, die ihren zugesagten Nutzen verfehlen \u2014 oder nie messen. Vom Board gesetzte Leitplanken erg\xE4nzen die roten Linien: Admins definieren Richtwerte in den Einstellungen \u2014 Budgetkonzentrations-Obergrenze je Gesch\xE4ftsbereich, Wert-Untergrenze f\xFCr finanzierte Initiativen und Unsicherheitslast-Obergrenze \u2014 jeweils mit Live-Pr\xFCfung, und jeder Versto\xDF erscheint hier als Entscheidungspunkt.",
8113
+ "concept.features.f30.body": "Eine regelbasierte, nach Dringlichkeit sortierte Liste der Entscheidungen, die die Portfoliodaten selbst einfordern: Stopp-/Aufschub-Kandidaten, Gate-Disziplin, Kapazit\xE4ts- und Budgetengp\xE4sse sowie Konzentration. Nutzenrealisierungs-Regeln markieren Produktionssysteme, die ihren zugesagten Nutzen verfehlen \u2014 oder nie messen. Vom Board gesetzte Leitplanken erg\xE4nzen die roten Linien: Admins definieren Richtwerte in den Einstellungen \u2014 Budgetkonzentrations-Obergrenze je Gesch\xE4ftsbereich, Wert-Untergrenze f\xFCr finanzierte Initiativen und Unsicherheitslast-Obergrenze \u2014 jeweils mit Live-Pr\xFCfung, und jeder Verstoss erscheint hier als Entscheidungspunkt.",
7378
8114
  "method.rules.r1.formula": "Nutzen \xD7 Validierung \u2192 Portfolio-Gestalt",
7379
8115
  "method.rules.r1.explanation": "Die Quadrantenposition auf der Nutzen-\xD7-Validierungs-Karte bestimmt die Go-/Skalieren-/Pilot-/Stopp-Entscheidung f\xFCr jede Initiative.",
7380
8116
  "method.rules.r2.formula": "Unsicherheits-Band \u2192 Veto-Kriterium",
@@ -7391,10 +8127,7 @@ var DE_INNOVATION = {
7391
8127
  "method.s5.incremental": "<strong>Inkrementelle Verfeinerungen</strong> (Pr\xE4zedenz 5) \u2014 Wert &lt; {v}, Validierung \u2265 {f} und Strategie &lt; {s}. Leicht umsetzbar, aber begrenzter Nutzen; geeignet als F\xFCllinitiativen.",
7392
8128
  "method.s5.uncategorised": "<strong>Unsortierte Experimente</strong> (Pr\xE4zedenz 7) \u2014 Auffangkategorie f\xFCr Initiativen, die keine der Regeln 1\u20136 erf\xFCllen. Bis zur Sch\xE4rfung der Bewertung explorativ behandeln.",
7393
8129
  "method.s5.ranking": "<strong>Reihenfolge innerhalb der Warteschlange.</strong> Initiativen werden zuerst nach den Kategorie-Regeln oben gruppiert (Pr\xE4zedenz 1 \u2192 7), dann innerhalb jeder Kategorie nach <strong>Wertpotenzial</strong>-Score absteigend geordnet, dann \u2014 wenn die Value-at-Stake-Gewichtung in den Einstellungen aktiv ist und die Zeile in Einfache Experimente / Skalierungs-Kandidaten liegt \u2014 nach Jahr-3-Nutzen absteigend. Letzter Tiebreaker ist <strong>Strategischer Impact</strong> absteigend, danach Name A\u2192Z, damit das Ergebnis deterministisch und reproduzierbar ist.",
7394
- "method.s10.p7": "<strong>Definition Einfaches Experiment.</strong> Die Kategorie Einfache Experimente setzt schnelle Zeit-zum-Wert voraus. Ein Einfaches Experiment, das von einem aktiven Vorgelagerten au\xDFerhalb der Einfachen Experimente abh\xE4ngt (Skalierungs-Kandidat, Neue Betriebsmodelle, Hochunsichere Wetten etc.), wird daher automatisch aus den Einfachen Experimenten demotet \u2014 der Vorlauf macht es nicht mehr schnell. Die Regel ist transitiv: H\xE4ngt A von B ab und wird B demotet, wird A in der n\xE4chsten Iteration ebenfalls demotet.",
7395
- "method.s7.p1": "F\xFCnf Presets (Baseline, Beschleunigte Einf\xFChrung, Kontrollierte Skalierung, Defensive Haltung, Betriebsmodell-Transformation) plus Custom, getrieben durch sechs explizite Hebel: Experiment-Tempo, Stage-Gate-Rigorosit\xE4t, Skalierungsintensit\xE4t, Team-Reife, Partnerdiversifizierung, Coaching-Intensit\xE4t.",
7396
- "method.s7.p2": "<strong>Baseline ist besonders.</strong> Die Reglerpositionen werden direkt aus dem Inventar abgeleitet \u2014 Experiment-Tempo = Anteil aktiver Initiativen in Production oder Scaling, Stage-Gate-Rigorosit\xE4t = Durchschnitt der Governance-&amp;-Unsicherheits-Scores, Skalierungsintensit\xE4t = Durchschnitt des Transformationspotenzials, Team-Reife = Mittel aus organisatorischer Hebelwirkung und Integrationsmachbarkeit, Partnerdiversifizierung = 100 \u2212 Partner-HHI-Risiko, Coaching-Intensit\xE4t = Durchschnitt der entsprechenden Sub-Scores. Diese abgeleiteten Positionen dienen zugleich als <strong>neutraler Bezugspunkt</strong> f\xFCr die Projektion.",
7397
- "method.s7.p3": "Die projizierten Ergebnisse werden als transparente lineare Kombination der <strong>Hebel-Deltas gegen\xFCber dieser Baseline</strong> berechnet, kombiniert mit strukturellen Inputs aus dem Portfolio (Produktionsanteil, Unsicherheitslast-Durchschnitt, HHI-basiertes Konzentrationsrisiko, Validierungs-Durchschnitt). Wenn Baseline gew\xE4hlt ist, liegt Current konstruktionsbedingt deckungsgleich darauf; das Bewegen eines Reglers erzeugt ein ehrliches Delta gegen\xFCber dem heutigen Stand des Portfolios.",
8130
+ "method.s10.p7": "<strong>Definition Einfaches Experiment.</strong> Die Kategorie Einfache Experimente setzt schnelle Zeit-zum-Wert voraus. Ein Einfaches Experiment, das von einem aktiven Vorgelagerten ausserhalb der Einfachen Experimente abh\xE4ngt (Skalierungs-Kandidat, Neue Betriebsmodelle, Hochunsichere Wetten etc.), wird daher automatisch aus den Einfachen Experimenten demotet \u2014 der Vorlauf macht es nicht mehr schnell. Die Regel ist transitiv: H\xE4ngt A von B ab und wird B demotet, wird A in der n\xE4chsten Iteration ebenfalls demotet.",
7398
8131
  "method.audit.scope.governance": "<strong>Status</strong> und die vier <strong>Bewertungsdimensions-Scores</strong> (Wertpotenzial, Validierung &amp; Evidenz, Governance &amp; Unsicherheit, Strategischer Impact) mit ihrer Konfidenz.",
7399
8132
  "method.audit.scope.metadata": "<strong>Alle Kern-Metadatenfelder</strong> \u2014 Name, Gesch\xE4ftseinheit, Verantwortliche, Beschreibung, Zeitplan, Budget, Partnerstrategie, L\xF6sungstyp, Innovations-Kategorie und Tags.",
7400
8133
  "method.gates.enforced.intro": "Zwei Governance-Felder werden beim Wechsel des Lebenszyklus-Status als harte Pr\xFCfungen erzwungen \u2014 aktiv, weil das EU-AI-Act-Modul f\xFCr diesen Arbeitsbereich aktiviert ist:",
@@ -8211,47 +8944,106 @@ function getModeOverride(mode, language, key) {
8211
8944
  if (enDict && key in enDict) return enDict[key];
8212
8945
  return void 0;
8213
8946
  }
8214
- var AI_GATE_ITEMS = [
8215
- { id: "businessCase", label: { en: "Business case validated", de: "Business Case validiert" } },
8216
- { id: "dpia", label: { en: "DPIA / risk assessment signed", de: "DSFA / Risikobewertung unterzeichnet" } },
8217
- { id: "owner", label: { en: "Owner accountable", de: "Owner verantwortlich" } },
8218
- { id: "compliance", label: { en: "Compliance review", de: "Compliance-Review" } },
8219
- { id: "hitl", label: { en: "Human-in-the-loop posture confirmed", de: "Human-in-the-Loop-Haltung best\xE4tigt" } }
8220
- ];
8221
- var DIGITAL_GATE_ITEMS = [
8222
- { id: "businessCase", label: { en: "Business case validated", de: "Business Case validiert" } },
8223
- { id: "architecture", label: { en: "Architecture review", de: "Architektur-Review" } },
8224
- { id: "owner", label: { en: "Owner accountable", de: "Owner verantwortlich" } },
8225
- { id: "operability", label: { en: "Operability check", de: "Betreibbarkeits-Check" } },
8226
- { id: "compliance", label: { en: "Compliance review", de: "Compliance-Review" } }
8227
- ];
8228
- var INNOVATION_GATE_ITEMS = [
8229
- { id: "hypothesis", label: { en: "Hypothesis & success metric defined", de: "Hypothese & Erfolgsmetrik definiert" } },
8230
- { id: "validation", label: { en: "Validation evidence captured", de: "Validierungsnachweise erfasst" } },
8231
- { id: "sponsor", label: { en: "Stage-gate sponsor sign-off", de: "Sponsor-Freigabe (Stage-Gate)" } },
8232
- { id: "nextStep", label: { en: "Next-step option declared (scale / pivot / stop)", de: "N\xE4chster Schritt benannt (skalieren / pivotieren / stoppen)" } }
8233
- ];
8234
- function buildDefaultsForMode(items) {
8235
- return {
8236
- "idea-pilot": items.map((i) => ({ ...i })),
8237
- "pilot-scaling": items.map((i) => ({ ...i })),
8238
- "scaling-production": items.map((i) => ({ ...i }))
8239
- };
8240
- }
8241
- var DEFAULT_GATE_CHECKLISTS_BY_MODE = {
8242
- ai: buildDefaultsForMode(AI_GATE_ITEMS),
8243
- digital: buildDefaultsForMode(DIGITAL_GATE_ITEMS),
8244
- innovation: buildDefaultsForMode(INNOVATION_GATE_ITEMS)
8947
+ var LEGACY_GATE_ITEMS = {
8948
+ ai: [
8949
+ { id: "businessCase", label: { en: "Business case validated", de: "Business Case validiert" } },
8950
+ { id: "dpia", label: { en: "DPIA / risk assessment signed", de: "DSFA / Risikobewertung unterzeichnet" } },
8951
+ { id: "owner", label: { en: "Owner accountable", de: "Owner verantwortlich" } },
8952
+ { id: "compliance", label: { en: "Compliance review", de: "Compliance-Review" } },
8953
+ { id: "hitl", label: { en: "Human-in-the-loop posture confirmed", de: "Human-in-the-Loop-Haltung best\xE4tigt" } }
8954
+ ],
8955
+ digital: [
8956
+ { id: "businessCase", label: { en: "Business case validated", de: "Business Case validiert" } },
8957
+ { id: "architecture", label: { en: "Architecture review", de: "Architektur-Review" } },
8958
+ { id: "owner", label: { en: "Owner accountable", de: "Owner verantwortlich" } },
8959
+ { id: "operability", label: { en: "Operability check", de: "Betreibbarkeits-Check" } },
8960
+ { id: "compliance", label: { en: "Compliance review", de: "Compliance-Review" } }
8961
+ ],
8962
+ innovation: [
8963
+ { id: "hypothesis", label: { en: "Hypothesis & success metric defined", de: "Hypothese & Erfolgsmetrik definiert" } },
8964
+ { id: "validation", label: { en: "Validation evidence captured", de: "Validierungsnachweise erfasst" } },
8965
+ { id: "sponsor", label: { en: "Stage-gate sponsor sign-off", de: "Sponsor-Freigabe (Stage-Gate)" } },
8966
+ { id: "nextStep", label: { en: "Next-step option declared (scale / pivot / stop)", de: "N\xE4chster Schritt benannt (skalieren / pivotieren / stoppen)" } }
8967
+ ]
8968
+ };
8969
+ var V520_RC_GATES = {
8970
+ ai: {
8971
+ "idea-pilot": [
8972
+ { id: "businessCase", label: { en: "Business case drafted, problem validated", de: "Business Case entworfen, Problem validiert" } },
8973
+ { id: "owner", label: { en: "Owner accountable", de: "Owner verantwortlich" } },
8974
+ { id: "successMetric", label: { en: "Success metric and kill criteria defined", de: "Erfolgsmetrik und Abbruchkriterien definiert" } },
8975
+ { id: "dpia", label: { en: "Initial DPIA / risk assessment signed", de: "Erste DSFA / Risikobewertung unterzeichnet" } },
8976
+ { id: "compliance", label: { en: "Compliance sign-off on pilot scope", de: "Compliance-Freigabe f\xFCr den Pilotumfang" } }
8977
+ ],
8978
+ "pilot-scaling": [
8979
+ { id: "successMet", label: { en: "Pilot met its pre-declared success metric", de: "Pilot hat seine vorab definierte Erfolgsmetrik erreicht" } },
8980
+ { id: "businessCase", label: { en: "Business case validated under audited assumptions", de: "Business Case unter gepr\xFCften Annahmen validiert" } },
8981
+ { id: "architecture", label: { en: "Architecture and operability checked at target volumes", de: "Architektur und Betreibbarkeit bei Zielvolumen gepr\xFCft" } },
8982
+ { id: "hitl", label: { en: "Human-in-the-loop posture confirmed", de: "Human-in-the-Loop-Haltung best\xE4tigt" } },
8983
+ { id: "compliance", label: { en: "Compliance review at scale", de: "Compliance-Review im Skalierungsumfang" } }
8984
+ ],
8985
+ "scaling-production": [
8986
+ { id: "slaMonitoring", label: { en: "SLAs, on-call and monitoring in place", de: "SLAs, Bereitschaft und Monitoring etabliert" } },
8987
+ { id: "dpia", label: { en: "DPIA and model card current", de: "DSFA und Model Card aktuell" } },
8988
+ { id: "owner", label: { en: "Operational owner and support model named", de: "Operativer Owner und Support-Modell benannt" } },
8989
+ { id: "runRate", label: { en: "Business case re-baselined on run-rate economics", de: "Business Case auf Run-Rate-\xD6konomie neu referenziert" } }
8990
+ ]
8991
+ },
8992
+ digital: {
8993
+ "idea-pilot": [
8994
+ { id: "businessCase", label: { en: "Business case drafted, problem validated", de: "Business Case entworfen, Problem validiert" } },
8995
+ { id: "owner", label: { en: "Owner accountable", de: "Owner verantwortlich" } },
8996
+ { id: "successMetric", label: { en: "Success metric defined", de: "Erfolgsmetrik definiert" } },
8997
+ { id: "compliance", label: { en: "Compliance sign-off on pilot scope", de: "Compliance-Freigabe f\xFCr den Pilotumfang" } }
8998
+ ],
8999
+ "pilot-scaling": [
9000
+ { id: "successMet", label: { en: "Pilot met its success metric", de: "Pilot hat seine Erfolgsmetrik erreicht" } },
9001
+ { id: "businessCase", label: { en: "Business case validated under audited assumptions", de: "Business Case unter gepr\xFCften Annahmen validiert" } },
9002
+ { id: "architecture", label: { en: "Architecture review at target volumes", de: "Architektur-Review bei Zielvolumen" } },
9003
+ { id: "compliance", label: { en: "Compliance review at scale", de: "Compliance-Review im Skalierungsumfang" } }
9004
+ ],
9005
+ "scaling-production": [
9006
+ { id: "operability", label: { en: "Operability check (SLAs, on-call, monitoring)", de: "Betreibbarkeits-Check (SLAs, Bereitschaft, Monitoring)" } },
9007
+ { id: "owner", label: { en: "Operational owner and support model named", de: "Operativer Owner und Support-Modell benannt" } },
9008
+ { id: "runRate", label: { en: "Business case re-baselined on run-rate", de: "Business Case auf Run-Rate neu referenziert" } }
9009
+ ]
9010
+ },
9011
+ innovation: {
9012
+ "idea-pilot": [
9013
+ { id: "hypothesis", label: { en: "Hypothesis and success metric defined", de: "Hypothese und Erfolgsmetrik definiert" } },
9014
+ { id: "sponsor", label: { en: "Sponsor sign-off on the experiment", de: "Sponsor-Freigabe f\xFCr das Experiment" } },
9015
+ { id: "testScope", label: { en: "Smallest falsifiable test scoped", de: "Kleinster falsifizierbarer Test definiert" } }
9016
+ ],
9017
+ "pilot-scaling": [
9018
+ { id: "validation", label: { en: "Validation evidence captured", de: "Validierungsnachweise erfasst" } },
9019
+ { id: "businessCase", label: { en: "Business case stands up beyond the experiment", de: "Business Case tr\xE4gt \xFCber das Experiment hinaus" } },
9020
+ { id: "sponsor", label: { en: "Sponsor sign-off (stage-gate)", de: "Sponsor-Freigabe (Stage-Gate)" } },
9021
+ { id: "nextStep", label: { en: "Next-step option declared (scale / pivot / stop)", de: "N\xE4chster Schritt benannt (skalieren / pivotieren / stoppen)" } }
9022
+ ],
9023
+ "scaling-production": [
9024
+ { id: "handover", label: { en: "Handover to run organisation agreed", de: "\xDCbergabe an die Run-Organisation vereinbart" } },
9025
+ { id: "benefits", label: { en: "Benefits tracking in place", de: "Nutzen-Tracking etabliert" } },
9026
+ { id: "sponsor", label: { en: "Sponsor sign-off (stage-gate)", de: "Sponsor-Freigabe (Stage-Gate)" } }
9027
+ ]
9028
+ }
8245
9029
  };
9030
+ var HISTORICAL_DEFAULT_SHAPES = [
9031
+ {
9032
+ ai: { "idea-pilot": LEGACY_GATE_ITEMS.ai, "pilot-scaling": LEGACY_GATE_ITEMS.ai, "scaling-production": LEGACY_GATE_ITEMS.ai },
9033
+ digital: { "idea-pilot": LEGACY_GATE_ITEMS.digital, "pilot-scaling": LEGACY_GATE_ITEMS.digital, "scaling-production": LEGACY_GATE_ITEMS.digital },
9034
+ innovation: { "idea-pilot": LEGACY_GATE_ITEMS.innovation, "pilot-scaling": LEGACY_GATE_ITEMS.innovation, "scaling-production": LEGACY_GATE_ITEMS.innovation }
9035
+ },
9036
+ V520_RC_GATES
9037
+ ];
8246
9038
 
8247
9039
  // ../../initiative-model/src/dimensions.ts
8248
9040
  var DIMENSION_KEYS = ["valueScale", "feasibility", "governance", "strategic"];
8249
9041
  var VALUE_SUBS = [
8250
9042
  "frequencyOfProcess",
9043
+ "volumeSensitivity",
8251
9044
  "labourIntensity",
8252
9045
  "operationalLeverage",
8253
9046
  "scalability",
8254
- "volumeSensitivity",
8255
9047
  "costReduction",
8256
9048
  "revenueImpact"
8257
9049
  ];
@@ -8270,18 +9062,18 @@ var GOVERNANCE_SUBS = [
8270
9062
  "decisionCriticality",
8271
9063
  "reputationalRisk",
8272
9064
  "operationalDependency",
8273
- "auditability",
8274
9065
  "monitoringComplexity",
8275
- "cybersecurityExposure"
9066
+ "cybersecurityExposure",
9067
+ "auditability"
8276
9068
  ];
8277
9069
  var STRATEGIC_SUBS = [
8278
9070
  "strategicDifferentiation",
8279
- "qualityImprovement",
8280
- "operatingModelAlignment",
8281
- "transformationPotential",
8282
9071
  "competitiveAdvantage",
8283
9072
  "clientImpact",
9073
+ "qualityImprovement",
9074
+ "operatingModelAlignment",
8284
9075
  "organisationalLeverage",
9076
+ "transformationPotential",
8285
9077
  "innovationCapability"
8286
9078
  ];
8287
9079
  var DIMENSION_SUBS = {
@@ -8336,19 +9128,26 @@ var DIMENSIONS = [
8336
9128
  "How often the underlying process runs. Higher frequency means more events benefit from automation.",
8337
9129
  "Wie oft der zugrundeliegende Prozess l\xE4uft. H\xF6here Frequenz = mehr Ereignisse profitieren von Automatisierung."
8338
9130
  ),
9131
+ sd(
9132
+ "volumeSensitivity",
9133
+ "Volume Sensitivity",
9134
+ "Volumensensitivit\xE4t",
9135
+ "How strongly business value grows with transaction volume. Higher = value compounds with throughput.",
9136
+ "Wie stark der Gesch\xE4ftsnutzen mit dem Transaktionsvolumen w\xE4chst. H\xF6her = Wert skaliert mit Durchsatz."
9137
+ ),
8339
9138
  sd(
8340
9139
  "labourIntensity",
8341
9140
  "Labour Intensity",
8342
9141
  "Personalintensit\xE4t",
8343
9142
  "Manual effort the process currently consumes. Higher = larger FTE-savings potential.",
8344
- "Manueller Aufwand, den der Prozess heute verursacht. H\xF6her = gr\xF6\xDFeres FTE-Einsparpotenzial."
9143
+ "Manueller Aufwand, den der Prozess heute verursacht. H\xF6her = gr\xF6sseres FTE-Einsparpotenzial."
8345
9144
  ),
8346
9145
  sd(
8347
9146
  "operationalLeverage",
8348
9147
  "Operational Leverage",
8349
9148
  "Operativer Hebel",
8350
9149
  "How much AI multiplies output per unit of human work. Higher = broader operational reach per FTE.",
8351
- "Wie stark KI den Output pro menschlicher Arbeitseinheit multipliziert. H\xF6her = gr\xF6\xDFere operative Reichweite pro FTE."
9150
+ "Wie stark KI den Output pro menschlicher Arbeitseinheit multipliziert. H\xF6her = gr\xF6ssere operative Reichweite pro FTE."
8352
9151
  ),
8353
9152
  sd(
8354
9153
  "scalability",
@@ -8357,13 +9156,6 @@ var DIMENSIONS = [
8357
9156
  "How easily the solution scales to more users, regions or volume without proportional cost.",
8358
9157
  "Wie leicht die L\xF6sung auf mehr Nutzer, Regionen oder Volumen skaliert, ohne dass Kosten proportional mitwachsen."
8359
9158
  ),
8360
- sd(
8361
- "volumeSensitivity",
8362
- "Volume Sensitivity",
8363
- "Volumensensitivit\xE4t",
8364
- "How strongly business value grows with transaction volume. Higher = value compounds with throughput.",
8365
- "Wie stark der Gesch\xE4ftsnutzen mit dem Transaktionsvolumen w\xE4chst. H\xF6her = Wert skaliert mit Durchsatz."
8366
- ),
8367
9159
  sd(
8368
9160
  "costReduction",
8369
9161
  "Cost Reduction",
@@ -8474,13 +9266,6 @@ var DIMENSIONS = [
8474
9266
  "How dependent core operations become on this system being continuously available.",
8475
9267
  "Wie abh\xE4ngig der Kernbetrieb von der st\xE4ndigen Verf\xFCgbarkeit dieses Systems wird."
8476
9268
  ),
8477
- sd(
8478
- "auditability",
8479
- "Auditability",
8480
- "Auditierbarkeit",
8481
- "Ability to log, trace and reconstruct decisions end-to-end for internal and external audit.",
8482
- "F\xE4higkeit, Entscheidungen End-to-End zu protokollieren, nachzuvollziehen und f\xFCr Audit-Zwecke zu rekonstruieren."
8483
- ),
8484
9269
  sd(
8485
9270
  "monitoringComplexity",
8486
9271
  "Monitoring Complexity",
@@ -8494,6 +9279,13 @@ var DIMENSIONS = [
8494
9279
  "Cybersicherheitsexposition",
8495
9280
  "Attack surface introduced \u2014 data, prompts, vendor APIs, model supply chain.",
8496
9281
  "Eingef\xFChrte Angriffsfl\xE4che \u2014 Daten, Prompts, Anbieter-APIs, Modell-Lieferkette."
9282
+ ),
9283
+ sd(
9284
+ "auditability",
9285
+ "Auditability",
9286
+ "Auditierbarkeit",
9287
+ "Ability to log, trace and reconstruct decisions end-to-end for internal and external audit.",
9288
+ "F\xE4higkeit, Entscheidungen End-to-End zu protokollieren, nachzuvollziehen und f\xFCr Audit-Zwecke zu rekonstruieren."
8497
9289
  )
8498
9290
  ]
8499
9291
  },
@@ -8508,27 +9300,6 @@ var DIMENSIONS = [
8508
9300
  "How much the initiative differentiates the firm from competitors.",
8509
9301
  "Wie stark sich das Unternehmen durch die Initiative von Wettbewerbern differenziert."
8510
9302
  ),
8511
- sd(
8512
- "qualityImprovement",
8513
- "Quality Improvement",
8514
- "Qualit\xE4tsverbesserung",
8515
- "Expected improvement in the quality of service, output or decision-making.",
8516
- "Erwartete Verbesserung der Qualit\xE4t von Service, Output oder Entscheidung."
8517
- ),
8518
- sd(
8519
- "operatingModelAlignment",
8520
- "Operating Model Alignment",
8521
- "Passung Betriebsmodell",
8522
- "Fit with the target operating model and existing capability map.",
8523
- "Passung zum Ziel-Betriebsmodell und zur bestehenden Capability-Map."
8524
- ),
8525
- sd(
8526
- "transformationPotential",
8527
- "Transformation Potential",
8528
- "Transformationspotenzial",
8529
- "Potential to reshape processes, roles, products or the revenue model.",
8530
- "Potenzial, Prozesse, Rollen, Produkte oder das Erl\xF6smodell neu zu formen."
8531
- ),
8532
9303
  sd(
8533
9304
  "competitiveAdvantage",
8534
9305
  "Competitive Advantage",
@@ -8543,6 +9314,20 @@ var DIMENSIONS = [
8543
9314
  "Visibility and value delivered directly to clients or end-users.",
8544
9315
  "Sichtbarkeit und Mehrwert, die direkt bei Kunden oder Endnutzern ankommen."
8545
9316
  ),
9317
+ sd(
9318
+ "qualityImprovement",
9319
+ "Quality Improvement",
9320
+ "Qualit\xE4tsverbesserung",
9321
+ "Expected improvement in the quality of service, output or decision-making.",
9322
+ "Erwartete Verbesserung der Qualit\xE4t von Service, Output oder Entscheidung."
9323
+ ),
9324
+ sd(
9325
+ "operatingModelAlignment",
9326
+ "Operating Model Alignment",
9327
+ "Passung Betriebsmodell",
9328
+ "Fit with the target operating model and existing capability map.",
9329
+ "Passung zum Ziel-Betriebsmodell und zur bestehenden Capability-Map."
9330
+ ),
8546
9331
  sd(
8547
9332
  "organisationalLeverage",
8548
9333
  "Organisational Leverage",
@@ -8550,6 +9335,13 @@ var DIMENSIONS = [
8550
9335
  "Reusability of the solution across business units, geographies or use cases.",
8551
9336
  "Wiederverwendbarkeit der L\xF6sung \xFCber Gesch\xE4ftsbereiche, Regionen oder Anwendungsf\xE4lle."
8552
9337
  ),
9338
+ sd(
9339
+ "transformationPotential",
9340
+ "Transformation Potential",
9341
+ "Transformationspotenzial",
9342
+ "Potential to reshape processes, roles, products or the revenue model.",
9343
+ "Potenzial, Prozesse, Rollen, Produkte oder das Erl\xF6smodell neu zu formen."
9344
+ ),
8553
9345
  sd(
8554
9346
  "innovationCapability",
8555
9347
  "Innovation Capability",
@@ -8642,11 +9434,18 @@ var OPTIONAL_SECTIONS = [
8642
9434
  { key: "economics", hint: { en: "Benefit/cost P10/P50/P90 ranges, ramp, confidence, discount rate", de: "Nutzen/Kosten P10/P50/P90, Ramp, Konfidenz, Diskontsatz" } },
8643
9435
  { key: "decisionLog", hint: { en: "Dated decisions (go/pause/stop/rescope/rebudget/other)", de: "Datierte Entscheidungen" } },
8644
9436
  { key: "statusReports", hint: { en: "Dated RAG reports (scope/timeline/budget/skills)", de: "Datierte RAG-Berichte" } },
9437
+ {
9438
+ key: "capabilityImpacts",
9439
+ hint: {
9440
+ en: "[{capabilityId, kind: improve|new|replace|retire, maturityTo?}] \u2014 what the initiative does to a capability of the organisation's map; maturityTo (1\u20135) is the level it brings the capability to (omit = the capability's target; never for retire). With the portfolio-context file, pick from read_portfolio_context \u2192 lists.capabilities (id, name, domain, current \u2192 target maturity); without it, leave empty and link capabilities in the app.",
9441
+ de: "[{capabilityId, kind: improve|new|replace|retire, maturityTo?}] \u2014 was die Initiative mit einer F\xE4higkeit der Landkarte macht; maturityTo (1\u20135) ist die Stufe, auf die sie die F\xE4higkeit bringt (fehlend = Ziel der F\xE4higkeit; nie bei retire). Mit der Portfolio-Kontext-Datei aus read_portfolio_context \u2192 lists.capabilities (ID, Name, Dom\xE4ne, Reife heute \u2192 Ziel) w\xE4hlen; ohne sie leer lassen und in der App verkn\xFCpfen."
9442
+ }
9443
+ },
8645
9444
  {
8646
9445
  key: "requiredSkills",
8647
9446
  hint: {
8648
- en: "[{skillId, fte}] \u2014 skillId is the id of a skill that exists in the organisation. With the portfolio-context file, pick from read_portfolio_context \u2192 lists.skills (id + name); without it, leave empty and link skills in the app.",
8649
- de: "[{skillId, fte}] \u2014 skillId ist die ID eines vorhandenen Skills. Mit der Portfolio-Kontext-Datei aus read_portfolio_context \u2192 lists.skills (ID + Name) w\xE4hlen; ohne sie leer lassen und in der App verkn\xFCpfen."
9447
+ en: "[{skillId, fte, runFte?}] \u2014 fte is the build-phase demand, runFte the optional run-team demand after the planned end (absent = build fte continues, 0 = no run demand). skillId is the id of a skill that exists in the organisation. With the portfolio-context file, pick from read_portfolio_context \u2192 lists.skills (id + name); without it, leave empty and link skills in the app.",
9448
+ de: "[{skillId, fte, runFte?}] \u2014 fte ist der Bedarf der Aufbauphase, runFte der optionale Run-Team-Bedarf nach dem geplanten Ende (fehlend = Aufbau-FTE l\xE4uft weiter, 0 = kein Run-Bedarf). skillId ist die ID eines vorhandenen Skills. Mit der Portfolio-Kontext-Datei aus read_portfolio_context \u2192 lists.skills (ID + Name) w\xE4hlen; ohne sie leer lassen und in der App verkn\xFCpfen."
8650
9449
  }
8651
9450
  }
8652
9451
  ];
@@ -8726,7 +9525,7 @@ function buildSchemaDescriptor(sectionShapes) {
8726
9525
  },
8727
9526
  optionalSections: OPTIONAL_SECTIONS,
8728
9527
  // Exact shapes of the object/array sections (aiAct, economics, actuals,
8729
- // decisionLog, statusReports, requiredSkills). Keys ending in "?" are
9528
+ // decisionLog, statusReports, requiredSkills, capabilityImpacts). Keys ending in "?" are
8730
9529
  // optional; "enum[a|b]" lists the allowed values; "<key>" marks a map.
8731
9530
  // Pass these sections as JSON objects/arrays. Any key not listed is
8732
9531
  // rejected with its path.
@@ -8736,7 +9535,7 @@ function buildSchemaDescriptor(sectionShapes) {
8736
9535
  ...AI_ACT_VOCABULARIES,
8737
9536
  note: "prohibitedPractices/art50Flags: arrays of these ids. artifacts/obligations: maps keyed by these ids. annexIIICategory: one of these, or omit when no Annex III area applies (record the reasoning in classificationRationale; annexExceptionRationale is only for an Art. 6(3) exception claim). Empty is honest; invented values are rejected."
8738
9537
  },
8739
- portfolioContext: "Ask the user for the organisation's portfolio-context file first (in the app: Import/Export \u2192 'Download portfolio context'). Call read_portfolio_context on it: it returns the interview plan in the organisation's own wording, the sub-dimensions that are switched off, the slider step the ratings must follow, and the organisation's business units, categories, tags, skills and initiatives \u2014 with the file, business unit and category MUST be from those lists (no inventing) and skill / dependency ids are validated. Pass the same context to assemble_initiative and export_initiative_file. Without the file, interview with the wording below and treat business unit / category as free text.",
9538
+ portfolioContext: "Ask the user for the organisation's portfolio-context file first (in the app: Import/Export \u2192 'Download portfolio context'). Call read_portfolio_context on it: it returns the interview plan in the organisation's own wording, the sub-dimensions that are switched off, the slider step the ratings must follow, and the organisation's business units, categories, tags, skills, initiatives and capabilities \u2014 with the file, business unit and category MUST be from those lists (no inventing) and skill / dependency / capability ids are validated. Pass the same context to assemble_initiative and export_initiative_file. Without the file, interview with the wording below and treat business unit / category as free text.",
8740
9539
  handoff: "Call assemble_initiative with the compact spec (+ context), review derivedScores (and any warnings) with the user, then call export_initiative_file with the SAME spec (+ context) \u2192 save the JSON \u2192 in the app: Import/Export \u2192 Single initiative \u2192 drop the file \u2192 'Add as new' \u2192 Confirm. If the initiative carries EU-AI-Act data, the organisation's EU-AI-Act module must be switched on (Settings \u203A AI Act) when importing."
8741
9540
  };
8742
9541
  }
@@ -8778,12 +9577,14 @@ var keepDescription = (from, to) => from.description ? to.describe(from.descript
8778
9577
  var dateField = (what) => external_exports.preprocess(normaliseDateInput, external_exports.string().refine(isCalendarDate, { message: `${what} must be a real calendar date \u2014 dd/mm/yyyy or yyyy-mm-dd` })).describe("dd/mm/yyyy (or yyyy-mm-dd)");
8779
9578
  var DATE_LIKE_KEY = /^date$|Date$|At$/;
8780
9579
  var MINTED_KEYS = /* @__PURE__ */ new Set(["id", "createdAt", "updatedAt"]);
9580
+ var SERVER_STAMP_KEY = /^(recorded|scored|checked)(At|By)$/;
8781
9581
  var holdsString = (s) => s instanceof external_exports.ZodString || s instanceof external_exports.ZodOptional && s.unwrap() instanceof external_exports.ZodString || s instanceof external_exports.ZodNullable && s.unwrap() instanceof external_exports.ZodString;
8782
9582
  function deepStrict(schema) {
8783
9583
  const walk = (s, inArrayItem = false) => {
8784
9584
  if (s instanceof external_exports.ZodObject) {
8785
9585
  const next = {};
8786
9586
  for (const [k, v] of Object.entries(s.shape)) {
9587
+ if (SERVER_STAMP_KEY.test(k)) continue;
8787
9588
  let field = walk(v, false);
8788
9589
  if (inArrayItem && MINTED_KEYS.has(k) && !(field instanceof external_exports.ZodOptional)) field = field.optional();
8789
9590
  if (DATE_LIKE_KEY.test(k) && holdsString(field)) field = keepDescription(field, external_exports.preprocess(normaliseDateInput, field));
@@ -8820,7 +9621,7 @@ var parseIfString = (v) => typeof v === "string" ? tryParseJson(v) : v;
8820
9621
  function wireSection(inner, description) {
8821
9622
  return external_exports.preprocess(parseIfString, deepStrict(inner)).describe(description);
8822
9623
  }
8823
- var SECTION_KEYS = ["aiAct", "economics", "actuals", "decisionLog", "statusReports", "requiredSkills"];
9624
+ var SECTION_KEYS = ["aiAct", "economics", "actuals", "decisionLog", "statusReports", "requiredSkills", "capabilityImpacts"];
8824
9625
  var SECTION_SCHEMAS = Object.fromEntries(
8825
9626
  SECTION_KEYS.map((k) => [k, contractSection(k)])
8826
9627
  );
@@ -8830,7 +9631,8 @@ var SECTION_DESCRIPTIONS = {
8830
9631
  actuals: "Actuals block (In Production only) \u2014 see sectionShapes.actuals.",
8831
9632
  decisionLog: "Decision log entries \u2014 see sectionShapes.decisionLog. Entry ids are minted by the Composer \u2014 leave them out. Dates dd/mm/yyyy or yyyy-mm-dd.",
8832
9633
  statusReports: "Status reports \u2014 see sectionShapes.statusReports. Report ids are minted by the Composer \u2014 leave them out. Dates dd/mm/yyyy or yyyy-mm-dd.",
8833
- requiredSkills: "Required skills [{skillId, fte}] \u2014 skillId must be the id of a skill that exists in the organisation. With the portfolio context the Composer validates it (read_portfolio_context \u2192 lists.skills gives id + name); without it, leave the list empty and link skills in the app."
9634
+ capabilityImpacts: "Capability links [{capabilityId, kind: improve|new|replace|retire, maturityTo?}]. maturityTo 1\u20135 = level reached (omit = the capability's target; never for retire). capabilityId: a capability of the map, from read_portfolio_context \u2192 lists.capabilities; without the context leave the list empty.",
9635
+ requiredSkills: "Required skills [{skillId, fte, runFte?}] \u2014 fte is the build-phase demand, the optional runFte the run-team demand after the planned end (absent = build fte continues, 0 = no run demand). skillId must be the id of a skill that exists in the organisation. With the portfolio context the Composer validates it (read_portfolio_context \u2192 lists.skills gives id + name); without it, leave the list empty and link skills in the app."
8834
9636
  };
8835
9637
  var contextWire = () => external_exports.preprocess(parseIfString, external_exports.union([external_exports.string().regex(/^ctx_[0-9a-f]{16}$/, "a contextId looks like ctx_<16 hex>"), external_exports.object({}).passthrough()]));
8836
9638
  var requiredText = () => external_exports.string().trim().min(1, "must not be empty");
@@ -8873,6 +9675,7 @@ var compactSpecSchema = external_exports.object({
8873
9675
  decisionLog: wireSection(SECTION_SCHEMAS.decisionLog, SECTION_DESCRIPTIONS.decisionLog).optional(),
8874
9676
  statusReports: wireSection(SECTION_SCHEMAS.statusReports, SECTION_DESCRIPTIONS.statusReports).optional(),
8875
9677
  requiredSkills: wireSection(SECTION_SCHEMAS.requiredSkills, SECTION_DESCRIPTIONS.requiredSkills).optional(),
9678
+ capabilityImpacts: wireSection(SECTION_SCHEMAS.capabilityImpacts, SECTION_DESCRIPTIONS.capabilityImpacts).optional(),
8876
9679
  aiRiskTier: external_exports.enum(AI_RISK_TIERS).optional(),
8877
9680
  hitlPosture: external_exports.enum(HITL_POSTURES).optional(),
8878
9681
  dpiaStatus: external_exports.enum(DPIA_STATUSES).optional(),
@@ -8882,7 +9685,7 @@ var compactSpecSchema = external_exports.object({
8882
9685
  prohibitedOverride: external_exports.string().optional(),
8883
9686
  aiAct: wireSection(SECTION_SCHEMAS.aiAct, SECTION_DESCRIPTIONS.aiAct).optional(),
8884
9687
  context: contextWire().optional().describe(
8885
- `OPTIONAL but strongly recommended: the organisation's portfolio context \u2014 the contextId returned by read_portfolio_context ("ctx_\u2026") or the file's JSON itself. With it, switched-off sub-dimensions are skipped in the score, business unit / category must be the organisation's own, and skill / dependency / update ids are validated.`
9688
+ `OPTIONAL but strongly recommended: the organisation's portfolio context \u2014 the contextId returned by read_portfolio_context ("ctx_\u2026") or the file's JSON itself. With it, switched-off sub-dimensions are skipped in the score, business unit / category must be the organisation's own, and skill / dependency / capability / update ids are validated.`
8886
9689
  )
8887
9690
  }).strict();
8888
9691
  var exportInputSchema = external_exports.object({
@@ -8927,7 +9730,7 @@ import { createHash } from "node:crypto";
8927
9730
 
8928
9731
  // ../../initiative-model/src/portfolio-context.ts
8929
9732
  var PORTFOLIO_CONTEXT_KIND = "portfolio-context";
8930
- var PORTFOLIO_CONTEXT_VERSION = 1;
9733
+ var PORTFOLIO_CONTEXT_VERSION = 2;
8931
9734
 
8932
9735
  // ../../initiative-model/src/ai-act-fields.ts
8933
9736
  var AI_ACT_FIELDS = [
@@ -8967,12 +9770,25 @@ var portfolioContextSchema = external_exports.object({
8967
9770
  suggestedTags: external_exports.array(external_exports.string()),
8968
9771
  skills: external_exports.array(external_exports.object({ id: external_exports.string().min(1), name: external_exports.string() }).passthrough()),
8969
9772
  initiatives: external_exports.array(external_exports.object({ id: external_exports.string().min(1), externalId: external_exports.string().trim().optional(), name: external_exports.string(), status: external_exports.enum(STATUS_VALUES) }).passthrough()),
8970
- sliders: external_exports.array(sliderSchema)
9773
+ sliders: external_exports.array(sliderSchema),
9774
+ /** Version 2 (2026-10-15): the capability map's leaves. Optional so a
9775
+ * version-1 file still parses — it then validates no capability links. */
9776
+ capabilities: external_exports.array(
9777
+ external_exports.object({
9778
+ id: external_exports.string().min(1),
9779
+ name: external_exports.string(),
9780
+ domain: external_exports.string(),
9781
+ importance: external_exports.enum(CAPABILITY_IMPORTANCES),
9782
+ currentMaturity: external_exports.number(),
9783
+ targetMaturity: external_exports.number()
9784
+ }).passthrough()
9785
+ ).optional()
8971
9786
  }).passthrough();
8972
9787
  var CONTEXT_SUPPORTED_VERSION = PORTFOLIO_CONTEXT_VERSION;
8973
9788
  function versionNotice(ctx) {
8974
9789
  return ctx.version > CONTEXT_SUPPORTED_VERSION ? `The portfolio-context file is version ${ctx.version}; this Composer understands version ${CONTEXT_SUPPORTED_VERSION}. Newer fields are ignored \u2014 update the Composer (Import/Export \u2192 download the extension again) to be safe.` : void 0;
8975
9790
  }
9791
+ var CAPABILITY_MATURITY_RANGE = `${CAPABILITY_MATURITY_MIN}\u2013${CAPABILITY_MATURITY_MAX}`;
8976
9792
  var CONTEXT_ID_PREFIX = "ctx_";
8977
9793
  var CACHE_MAX = 32;
8978
9794
  var cache = /* @__PURE__ */ new Map();
@@ -9068,6 +9884,31 @@ function checkAgainstContext(spec, ctx) {
9068
9884
  for (const [i, s] of (spec.requiredSkills ?? []).entries()) {
9069
9885
  if (!skillIds.has(s.skillId)) errors.push(`requiredSkills.${i}.skillId: "${s.skillId}" is not a skill of this organisation \u2014 pick from read_portfolio_context \u2192 lists.skills (id + name), or leave requiredSkills empty.`);
9070
9886
  }
9887
+ const impacts = spec.capabilityImpacts ?? [];
9888
+ if (impacts.length && ctx.capabilities === void 0) {
9889
+ errors.push(
9890
+ "capabilityImpacts: this portfolio-context file predates the capability map (version 1) \u2014 download it again from the app (Import/Export \u2192 Download portfolio context) so the Composer can check capability ids, or leave capabilityImpacts empty and link capabilities in the app."
9891
+ );
9892
+ } else {
9893
+ const caps = new Map((ctx.capabilities ?? []).map((c) => [c.id, c]));
9894
+ const seen = /* @__PURE__ */ new Set();
9895
+ for (const [i, link] of impacts.entries()) {
9896
+ if (seen.has(link.capabilityId)) continue;
9897
+ seen.add(link.capabilityId);
9898
+ const cap = caps.get(link.capabilityId);
9899
+ if (!cap) {
9900
+ errors.push(
9901
+ caps.size ? `capabilityImpacts.${i}.capabilityId: "${link.capabilityId}" is not a capability of this organisation's map \u2014 pick from read_portfolio_context \u2192 lists.capabilities (id + name + domain), or leave capabilityImpacts empty.` : `capabilityImpacts.${i}.capabilityId: this organisation has no capability map yet \u2014 it is built in the app's Settings \u203A Taxonomy; leave capabilityImpacts empty.`
9902
+ );
9903
+ continue;
9904
+ }
9905
+ if (link.maturityTo !== void 0 && link.kind !== "retire" && link.maturityTo < cap.currentMaturity) {
9906
+ warnings.push(
9907
+ `capabilityImpacts.${i}.maturityTo: ${link.maturityTo} is below the current maturity ${cap.currentMaturity} of "${cap.name}" \u2014 the app shows the capability as unchanged; the target is ${cap.targetMaturity}.`
9908
+ );
9909
+ }
9910
+ }
9911
+ }
9071
9912
  const aiFieldsSet = AI_ACT_FIELDS.filter((f) => spec[f] !== void 0);
9072
9913
  if (aiFieldsSet.length && !ctx.aiActEnabled) {
9073
9914
  warnings.push(
@@ -9110,6 +9951,7 @@ function buildInterviewPlan(ctx, contextId) {
9110
9951
  ...allOff.length ? [`Dimension(s) with EVERY sub-dimension switched off (${allOff.join(", ")}) still need an entry in evaluation: { subs: {}, confidence } \u2014 the score is 0 there; ask only for the confidence.`] : [],
9111
9952
  ctx.businessUnits.length && ctx.categories.length ? "businessUnit MUST be one of lists.businessUnits and aiCategory one of lists.categories (matched case-insensitively, normalised to the organisation's spelling) \u2014 the Composer rejects anything else; new ones are created in the app's Settings, not in the interview." : "This organisation has no business units and/or categories configured yet \u2014 they must be added in the app's Settings and the context downloaded again before an initiative can be assembled.",
9112
9953
  "dependsOn entries must be ids from lists.initiatives; requiredSkills[].skillId must be ids from lists.skills. Never invent an id; leave the list empty when unsure.",
9954
+ ctx.capabilities === void 0 ? "This file predates the capability map (version 1): capability links cannot be checked \u2014 leave capabilityImpacts empty, or ask the user to download the portfolio context again." : ctx.capabilities.length ? `capabilityImpacts[].capabilityId must be ids from lists.capabilities (${ctx.capabilities.length} capabilities; each lists its domain, importance and current \u2192 target maturity ${CAPABILITY_MATURITY_RANGE}). kind is improve | new | replace | retire; maturityTo (${CAPABILITY_MATURITY_RANGE}) is the level the initiative brings the capability to \u2014 omit it to mean the capability's target, and never send it for retire. Ask which capabilities the initiative changes and to what level.` : "This organisation has no capability map yet (built in the app's Settings \u203A Taxonomy): leave capabilityImpacts empty.",
9113
9955
  "To UPDATE an existing initiative instead of creating a new one, pass its id (from lists.initiatives) as `id` in the spec \u2014 the exported file then updates it in the app (Import/Export \u2192 Single initiative \u2192 'Update'). Omit id for a new initiative. Entries in lists.initiatives may carry externalId \u2014 the organisation's own reference (e.g. IC-26-118) \u2014 use it to recognise which initiative the user means. An update REPLACES the whole record: any field, section or row you omit is CLEARED \u2014 decision log, status reports and links included \u2014 so re-send everything that must survive. Exception: the organisation's externalId is carried over automatically when omitted.",
9114
9956
  ...ctx.sliderGranularity ? [`Ratings are in steps of ${ctx.sliderGranularity} (the organisation's slider step \u2014 Settings \u203A Slider granularity): ask for and send only multiples of ${ctx.sliderGranularity} between 0 and 100 (${gridExample(ctx.sliderGranularity)}); any other value is rejected.`] : [],
9115
9957
  "Dates: talk to the user in dd/mm/yyyy; you may send dates as dd/mm/yyyy, dd.mm.yyyy or yyyy-mm-dd \u2014 the Composer stores yyyy-mm-dd.",
@@ -9134,7 +9976,17 @@ function buildInterviewPlan(ctx, contextId) {
9134
9976
  categories: ctx.categories,
9135
9977
  suggestedTags: ctx.suggestedTags,
9136
9978
  skills: ctx.skills.map((s) => ({ id: s.id, name: s.name })),
9137
- initiatives: ctx.initiatives.map((i) => ({ id: i.id, ...i.externalId ? { externalId: i.externalId } : {}, name: i.name, status: i.status }))
9979
+ initiatives: ctx.initiatives.map((i) => ({ id: i.id, ...i.externalId ? { externalId: i.externalId } : {}, name: i.name, status: i.status })),
9980
+ ...ctx.capabilities ? {
9981
+ capabilities: ctx.capabilities.map((c) => ({
9982
+ id: c.id,
9983
+ name: c.name,
9984
+ domain: c.domain,
9985
+ importance: c.importance,
9986
+ currentMaturity: c.currentMaturity,
9987
+ targetMaturity: c.targetMaturity
9988
+ }))
9989
+ } : {}
9138
9990
  },
9139
9991
  interview: {
9140
9992
  dimensions,
@@ -9230,6 +10082,19 @@ function assembleInitiative(input, now = /* @__PURE__ */ new Date()) {
9230
10082
  }
9231
10083
  }
9232
10084
  if (spec.aiAct && typeof spec.aiAct === "object") checkAiActVocabularies(spec.aiAct, errors);
10085
+ const allImpacts = spec.capabilityImpacts ?? [];
10086
+ const seenCaps = /* @__PURE__ */ new Set();
10087
+ const impacts = [];
10088
+ for (const [i, link] of allImpacts.entries()) {
10089
+ if (seenCaps.has(link.capabilityId)) {
10090
+ errors.push(`capabilityImpacts.${i}.capabilityId: "${link.capabilityId}" is linked twice \u2014 one link per capability.`);
10091
+ continue;
10092
+ }
10093
+ seenCaps.add(link.capabilityId);
10094
+ impacts.push([i, link]);
10095
+ if (link.kind === "retire" && link.maturityTo !== void 0) errors.push(`capabilityImpacts.${i}.maturityTo: a retire link has no target level \u2014 omit maturityTo.`);
10096
+ else if (link.maturityTo !== void 0 && !Number.isInteger(link.maturityTo)) errors.push(`capabilityImpacts.${i}.maturityTo: must be a whole number 1\u20135 (got ${link.maturityTo}).`);
10097
+ }
9233
10098
  let businessUnit = spec.businessUnit;
9234
10099
  let aiCategory = spec.aiCategory;
9235
10100
  if (context) {
@@ -9243,6 +10108,9 @@ function assembleInitiative(input, now = /* @__PURE__ */ new Date()) {
9243
10108
  for (const [i, id] of (spec.dependsOn ?? []).entries()) {
9244
10109
  if (!isUuid(id)) errors.push(`dependsOn.${i}: "${id}" is not a UUID \u2014 without the organisation's portfolio context the Composer cannot verify ids; leave dependsOn empty and link dependencies in the app, or provide the context.`);
9245
10110
  }
10111
+ for (const [i, link] of impacts) {
10112
+ if (!isUuid(link.capabilityId)) errors.push(`capabilityImpacts.${i}.capabilityId: "${link.capabilityId}" is not a UUID \u2014 without the organisation's portfolio context the Composer cannot verify capability ids; leave capabilityImpacts empty and link capabilities in the app, or provide the context.`);
10113
+ }
9246
10114
  }
9247
10115
  if (spec.timelineStart && spec.timelineEnd && spec.timelineEnd < spec.timelineStart) {
9248
10116
  warnings.push("timelineEnd is before timelineStart");
@@ -9288,10 +10156,10 @@ function assembleInitiative(input, now = /* @__PURE__ */ new Date()) {
9288
10156
  }
9289
10157
 
9290
10158
  // ../../initiative-model/src/backup-version.ts
9291
- var BACKUP_VERSION = 10;
10159
+ var BACKUP_VERSION = 11;
9292
10160
 
9293
10161
  // src/envelope.ts
9294
- var ENVELOPE_BRAND = "BICon Transformation Portfolio Steering";
10162
+ var ENVELOPE_BRAND = "BICon Portfolio Steering";
9295
10163
  var ENVELOPE_KIND = "single-initiative";
9296
10164
  var ENVELOPE_VERSION = BACKUP_VERSION;
9297
10165
  function buildEnvelope(initiative, opts = {}) {
@@ -9346,12 +10214,12 @@ function createServer() {
9346
10214
  async () => text({
9347
10215
  capabilities: [
9348
10216
  "strict typed schemas: unknown keys anywhere in the spec are rejected with their exact path (never silently dropped)",
9349
- "sections (aiAct/economics/actuals/decisionLog/statusReports/requiredSkills) accept a JSON object/array or the same JSON as a string; row ids are minted by the Composer",
10217
+ "sections (aiAct/economics/actuals/decisionLog/statusReports/requiredSkills/capabilityImpacts) accept a JSON object/array or the same JSON as a string; row ids are minted by the Composer",
9350
10218
  "dates accepted as dd/mm/yyyy, dd.mm.yyyy or yyyy-mm-dd (stored as yyyy-mm-dd)",
9351
10219
  "get_initiative_schema: sectionShapes, aiActVocabularies, portfolio-mode wording overlays",
9352
10220
  "AI-Act vocabulary and id-format enforcement with the allowed values in the error",
9353
10221
  "one pipeline: export_initiative_file takes the same spec as assemble_initiative \u2014 scores are always derived; pass `id` to update an existing initiative",
9354
- "portfolio context: read_portfolio_context turns the app's exported context file into an organisation-specific interview plan and a short contextId; with it, switched-off sub-dimensions are skipped in the score, business unit / category must be the organisation's own, and skill / dependency / update ids are validated"
10222
+ "portfolio context: read_portfolio_context turns the app's exported context file into an organisation-specific interview plan and a short contextId; with it, switched-off sub-dimensions are skipped in the score, business unit / category must be the organisation's own, and skill / dependency / capability / update ids are validated (capabilities from the version-2 context file)"
9355
10223
  ]
9356
10224
  })
9357
10225
  );
@@ -9367,7 +10235,7 @@ function createServer() {
9367
10235
  "read_portfolio_context",
9368
10236
  {
9369
10237
  title: "Read portfolio context",
9370
- description: "Turns the organisation's portfolio-context file (downloaded in the BICon app: Import/Export \u2192 'Download portfolio context') into the interview plan for THIS organisation: its own labels, help texts and rating notes for the sub-dimensions, which sub-dimensions are switched off (do not ask, not scored), its business units, categories, tags, skills (id + name) and initiatives (id + name), currency, discount rate and whether the EU-AI-Act module is on \u2014 plus a short contextId. Call it right after get_initiative_schema when the user provides the file, then pass `context: \"<contextId>\"` to assemble_initiative and export_initiative_file.",
10238
+ description: "Turns the organisation's portfolio-context file (downloaded in the BICon Portfolio Steering app: Import/Export \u2192 'Download portfolio context') into the interview plan for THIS organisation: its own labels, help texts and rating notes for the sub-dimensions, which sub-dimensions are switched off (do not ask, not scored), its business units, categories, tags, skills (id + name), initiatives (id + name) and the capability map's capabilities (id, name, domain, importance, current \u2192 target maturity), currency, discount rate and whether the EU-AI-Act module is on \u2014 plus a short contextId. Call it right after get_initiative_schema when the user provides the file, then pass `context: \"<contextId>\"` to assemble_initiative and export_initiative_file.",
9371
10239
  inputSchema: readContextInputSchema
9372
10240
  },
9373
10241
  async ({ context }) => {