@bicon/mcp-composer 0.3.6 → 0.5.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 +75 -13
  2. package/dist/index.mjs +671 -69
  3. package/package.json +8 -2
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.6" : readPackageVersion();
15
+ var COMPOSER_VERSION = true ? "0.5.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,12 +4102,75 @@ 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, manage_milestones.")
4111
4174
  });
4112
4175
  var ListOrganizationMembersResponse = arrayType(ListOrganizationMembersResponseItem);
4113
4176
  var SyncOrganizationMembersResponse = objectType({
@@ -4117,17 +4180,18 @@ var SyncOrganizationMembersResponse = objectType({
4117
4180
  var GetMyOrganizationAccessResponse = objectType({
4118
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.`),
4119
4182
  "role": enumType(["admin", "member", "viewer"]),
4120
- "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, manage_milestones."),
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.")
4121
4185
  });
4122
4186
  var UpdateOrganizationMemberPermissionsParams = objectType({
4123
4187
  "userId": coerce.string().uuid()
4124
4188
  });
4125
4189
  var UpdateOrganizationMemberPermissionsBody = objectType({
4126
- "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, manage_milestones.")
4127
4191
  });
4128
4192
  var UpdateOrganizationMemberPermissionsResponse = objectType({
4129
4193
  "userId": stringType().uuid(),
4130
- "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, manage_milestones.")
4131
4195
  });
4132
4196
  var ListPermissionProfilesResponseItem = objectType({
4133
4197
  "id": stringType().uuid(),
@@ -4216,9 +4280,17 @@ var listSnapshotsResponseInitiativesItemStatusReportsItemBudgetCommentMax = 1e4;
4216
4280
  var listSnapshotsResponseInitiativesItemStatusReportsItemSkillsCommentMax = 1e4;
4217
4281
  var listSnapshotsResponseInitiativesItemStatusReportsItemSummaryMax = 1e4;
4218
4282
  var listSnapshotsResponseInitiativesItemStatusReportsMax = 1e3;
4283
+ var listSnapshotsResponseInitiativesItemMilestonesItemTitleMax = 300;
4284
+ var listSnapshotsResponseInitiativesItemMilestonesItemBaselineDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4285
+ var listSnapshotsResponseInitiativesItemMilestonesItemForecastDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4286
+ var listSnapshotsResponseInitiativesItemMilestonesItemDoneDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4287
+ var listSnapshotsResponseInitiativesItemMilestonesItemNoteMax = 1e4;
4288
+ var listSnapshotsResponseInitiativesItemMilestonesMax = 30;
4219
4289
  var listSnapshotsResponseInitiativesItemDependsOnMax = 1e3;
4220
4290
  var listSnapshotsResponseInitiativesItemRequiredSkillsItemRunFteMin = 0;
4221
4291
  var listSnapshotsResponseInitiativesItemRequiredSkillsMax = 1e3;
4292
+ var listSnapshotsResponseInitiativesItemCapabilityImpactsItemMaturityToMax = 5;
4293
+ var listSnapshotsResponseInitiativesItemCapabilityImpactsMax = 1e3;
4222
4294
  var listSnapshotsResponseInitiativesItemDpiaUrlMax = 2e3;
4223
4295
  var listSnapshotsResponseInitiativesItemModelCardUrlMax = 2e3;
4224
4296
  var listSnapshotsResponseInitiativesItemProhibitedOverrideMax = 2e3;
@@ -4268,7 +4340,12 @@ var ListSnapshotsResponseItem = objectType({
4268
4340
  "evaluation": objectType({
4269
4341
  "valueScale": objectType({
4270
4342
  "score": numberType(),
4271
- "confidence": enumType(["Low", "Medium", "High"])
4343
+ "confidence": enumType(["Low", "Medium", "High"]),
4344
+ "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."),
4345
+ "scoredBy": objectType({
4346
+ "userId": stringType().uuid(),
4347
+ "name": stringType()
4348
+ }).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.")
4272
4349
  }).and(objectType({
4273
4350
  "subs": objectType({
4274
4351
  "frequencyOfProcess": numberType(),
@@ -4282,7 +4359,12 @@ var ListSnapshotsResponseItem = objectType({
4282
4359
  })),
4283
4360
  "feasibility": objectType({
4284
4361
  "score": numberType(),
4285
- "confidence": enumType(["Low", "Medium", "High"])
4362
+ "confidence": enumType(["Low", "Medium", "High"]),
4363
+ "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."),
4364
+ "scoredBy": objectType({
4365
+ "userId": stringType().uuid(),
4366
+ "name": stringType()
4367
+ }).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.")
4286
4368
  }).and(objectType({
4287
4369
  "subs": objectType({
4288
4370
  "dataAvailability": numberType(),
@@ -4296,7 +4378,12 @@ var ListSnapshotsResponseItem = objectType({
4296
4378
  })),
4297
4379
  "governance": objectType({
4298
4380
  "score": numberType(),
4299
- "confidence": enumType(["Low", "Medium", "High"])
4381
+ "confidence": enumType(["Low", "Medium", "High"]),
4382
+ "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."),
4383
+ "scoredBy": objectType({
4384
+ "userId": stringType().uuid(),
4385
+ "name": stringType()
4386
+ }).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.")
4300
4387
  }).and(objectType({
4301
4388
  "subs": objectType({
4302
4389
  "regulatoryExposure": numberType(),
@@ -4311,7 +4398,12 @@ var ListSnapshotsResponseItem = objectType({
4311
4398
  })),
4312
4399
  "strategic": objectType({
4313
4400
  "score": numberType(),
4314
- "confidence": enumType(["Low", "Medium", "High"])
4401
+ "confidence": enumType(["Low", "Medium", "High"]),
4402
+ "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."),
4403
+ "scoredBy": objectType({
4404
+ "userId": stringType().uuid(),
4405
+ "name": stringType()
4406
+ }).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.")
4315
4407
  }).and(objectType({
4316
4408
  "subs": objectType({
4317
4409
  "strategicDifferentiation": numberType(),
@@ -4366,7 +4458,12 @@ var ListSnapshotsResponseItem = objectType({
4366
4458
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
4367
4459
  "owner": stringType().max(listSnapshotsResponseInitiativesItemDecisionLogItemOwnerMax).optional(),
4368
4460
  "rationale": stringType().max(listSnapshotsResponseInitiativesItemDecisionLogItemRationaleMax).optional(),
4369
- "createdAt": stringType().optional()
4461
+ "createdAt": stringType().optional(),
4462
+ "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."),
4463
+ "recordedBy": objectType({
4464
+ "userId": stringType().uuid(),
4465
+ "name": stringType()
4466
+ }).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.")
4370
4467
  })).max(listSnapshotsResponseInitiativesItemDecisionLogMax).optional(),
4371
4468
  "statusReports": arrayType(objectType({
4372
4469
  "id": stringType(),
@@ -4390,12 +4487,25 @@ var ListSnapshotsResponseItem = objectType({
4390
4487
  }),
4391
4488
  "summary": stringType().max(listSnapshotsResponseInitiativesItemStatusReportsItemSummaryMax).optional()
4392
4489
  })).max(listSnapshotsResponseInitiativesItemStatusReportsMax).optional(),
4490
+ "milestones": arrayType(objectType({
4491
+ "id": stringType(),
4492
+ "title": stringType().min(1).max(listSnapshotsResponseInitiativesItemMilestonesItemTitleMax),
4493
+ "baselineDate": stringType().regex(listSnapshotsResponseInitiativesItemMilestonesItemBaselineDateRegExp),
4494
+ "forecastDate": stringType().regex(listSnapshotsResponseInitiativesItemMilestonesItemForecastDateRegExp).optional(),
4495
+ "doneDate": stringType().regex(listSnapshotsResponseInitiativesItemMilestonesItemDoneDateRegExp).optional(),
4496
+ "note": stringType().max(listSnapshotsResponseInitiativesItemMilestonesItemNoteMax).optional()
4497
+ }).describe("A dated intermediate result (docs/milestones-concept-2026-10-17.md). baselineDate is the agreed plan, forecastDate today's expectation (absent = the baseline), doneDate marks it reached; all yyyy-mm-dd.")).max(listSnapshotsResponseInitiativesItemMilestonesMax).optional(),
4393
4498
  "dependsOn": arrayType(stringType()).max(listSnapshotsResponseInitiativesItemDependsOnMax),
4394
4499
  "requiredSkills": arrayType(objectType({
4395
4500
  "skillId": stringType(),
4396
4501
  "fte": numberType(),
4397
4502
  "runFte": numberType().min(listSnapshotsResponseInitiativesItemRequiredSkillsItemRunFteMin).optional()
4398
4503
  })).max(listSnapshotsResponseInitiativesItemRequiredSkillsMax).optional(),
4504
+ "capabilityImpacts": arrayType(objectType({
4505
+ "capabilityId": stringType(),
4506
+ "kind": enumType(["improve", "new", "replace", "retire"]),
4507
+ "maturityTo": numberType().min(1).max(listSnapshotsResponseInitiativesItemCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
4508
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(listSnapshotsResponseInitiativesItemCapabilityImpactsMax).optional(),
4399
4509
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
4400
4510
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
4401
4511
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
@@ -4406,7 +4516,12 @@ var ListSnapshotsResponseItem = objectType({
4406
4516
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
4407
4517
  "checked": booleanType(),
4408
4518
  "asOfDate": stringType().optional(),
4409
- "note": stringType().max(listSnapshotsResponseInitiativesItemGateEvidenceNoteMax).optional()
4519
+ "note": stringType().max(listSnapshotsResponseInitiativesItemGateEvidenceNoteMax).optional(),
4520
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
4521
+ "checkedBy": objectType({
4522
+ "userId": stringType().uuid(),
4523
+ "name": stringType()
4524
+ }).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.")
4410
4525
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
4411
4526
  "gateBypassed": booleanType().optional(),
4412
4527
  "aiAct": objectType({
@@ -4489,6 +4604,7 @@ var ListSnapshotsResponseItem = objectType({
4489
4604
  "userId": stringType().uuid(),
4490
4605
  "name": stringType()
4491
4606
  }).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."),
4607
+ "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."),
4492
4608
  "createdAt": stringType(),
4493
4609
  "updatedAt": stringType()
4494
4610
  })),
@@ -4516,9 +4632,17 @@ var createSnapshotBodyInitiativesItemStatusReportsItemBudgetCommentMax = 1e4;
4516
4632
  var createSnapshotBodyInitiativesItemStatusReportsItemSkillsCommentMax = 1e4;
4517
4633
  var createSnapshotBodyInitiativesItemStatusReportsItemSummaryMax = 1e4;
4518
4634
  var createSnapshotBodyInitiativesItemStatusReportsMax = 1e3;
4635
+ var createSnapshotBodyInitiativesItemMilestonesItemTitleMax = 300;
4636
+ var createSnapshotBodyInitiativesItemMilestonesItemBaselineDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4637
+ var createSnapshotBodyInitiativesItemMilestonesItemForecastDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4638
+ var createSnapshotBodyInitiativesItemMilestonesItemDoneDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4639
+ var createSnapshotBodyInitiativesItemMilestonesItemNoteMax = 1e4;
4640
+ var createSnapshotBodyInitiativesItemMilestonesMax = 30;
4519
4641
  var createSnapshotBodyInitiativesItemDependsOnMax = 1e3;
4520
4642
  var createSnapshotBodyInitiativesItemRequiredSkillsItemRunFteMin = 0;
4521
4643
  var createSnapshotBodyInitiativesItemRequiredSkillsMax = 1e3;
4644
+ var createSnapshotBodyInitiativesItemCapabilityImpactsItemMaturityToMax = 5;
4645
+ var createSnapshotBodyInitiativesItemCapabilityImpactsMax = 1e3;
4522
4646
  var createSnapshotBodyInitiativesItemDpiaUrlMax = 2e3;
4523
4647
  var createSnapshotBodyInitiativesItemModelCardUrlMax = 2e3;
4524
4648
  var createSnapshotBodyInitiativesItemProhibitedOverrideMax = 2e3;
@@ -4568,7 +4692,12 @@ var CreateSnapshotBody = objectType({
4568
4692
  "evaluation": objectType({
4569
4693
  "valueScale": objectType({
4570
4694
  "score": numberType(),
4571
- "confidence": enumType(["Low", "Medium", "High"])
4695
+ "confidence": enumType(["Low", "Medium", "High"]),
4696
+ "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."),
4697
+ "scoredBy": objectType({
4698
+ "userId": stringType().uuid(),
4699
+ "name": stringType()
4700
+ }).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.")
4572
4701
  }).and(objectType({
4573
4702
  "subs": objectType({
4574
4703
  "frequencyOfProcess": numberType(),
@@ -4582,7 +4711,12 @@ var CreateSnapshotBody = objectType({
4582
4711
  })),
4583
4712
  "feasibility": objectType({
4584
4713
  "score": numberType(),
4585
- "confidence": enumType(["Low", "Medium", "High"])
4714
+ "confidence": enumType(["Low", "Medium", "High"]),
4715
+ "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."),
4716
+ "scoredBy": objectType({
4717
+ "userId": stringType().uuid(),
4718
+ "name": stringType()
4719
+ }).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.")
4586
4720
  }).and(objectType({
4587
4721
  "subs": objectType({
4588
4722
  "dataAvailability": numberType(),
@@ -4596,7 +4730,12 @@ var CreateSnapshotBody = objectType({
4596
4730
  })),
4597
4731
  "governance": objectType({
4598
4732
  "score": numberType(),
4599
- "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.")
4600
4739
  }).and(objectType({
4601
4740
  "subs": objectType({
4602
4741
  "regulatoryExposure": numberType(),
@@ -4611,7 +4750,12 @@ var CreateSnapshotBody = objectType({
4611
4750
  })),
4612
4751
  "strategic": objectType({
4613
4752
  "score": numberType(),
4614
- "confidence": enumType(["Low", "Medium", "High"])
4753
+ "confidence": enumType(["Low", "Medium", "High"]),
4754
+ "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."),
4755
+ "scoredBy": objectType({
4756
+ "userId": stringType().uuid(),
4757
+ "name": stringType()
4758
+ }).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.")
4615
4759
  }).and(objectType({
4616
4760
  "subs": objectType({
4617
4761
  "strategicDifferentiation": numberType(),
@@ -4666,7 +4810,12 @@ var CreateSnapshotBody = objectType({
4666
4810
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
4667
4811
  "owner": stringType().max(createSnapshotBodyInitiativesItemDecisionLogItemOwnerMax).optional(),
4668
4812
  "rationale": stringType().max(createSnapshotBodyInitiativesItemDecisionLogItemRationaleMax).optional(),
4669
- "createdAt": stringType().optional()
4813
+ "createdAt": stringType().optional(),
4814
+ "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."),
4815
+ "recordedBy": objectType({
4816
+ "userId": stringType().uuid(),
4817
+ "name": stringType()
4818
+ }).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.")
4670
4819
  })).max(createSnapshotBodyInitiativesItemDecisionLogMax).optional(),
4671
4820
  "statusReports": arrayType(objectType({
4672
4821
  "id": stringType(),
@@ -4690,12 +4839,25 @@ var CreateSnapshotBody = objectType({
4690
4839
  }),
4691
4840
  "summary": stringType().max(createSnapshotBodyInitiativesItemStatusReportsItemSummaryMax).optional()
4692
4841
  })).max(createSnapshotBodyInitiativesItemStatusReportsMax).optional(),
4842
+ "milestones": arrayType(objectType({
4843
+ "id": stringType(),
4844
+ "title": stringType().min(1).max(createSnapshotBodyInitiativesItemMilestonesItemTitleMax),
4845
+ "baselineDate": stringType().regex(createSnapshotBodyInitiativesItemMilestonesItemBaselineDateRegExp),
4846
+ "forecastDate": stringType().regex(createSnapshotBodyInitiativesItemMilestonesItemForecastDateRegExp).optional(),
4847
+ "doneDate": stringType().regex(createSnapshotBodyInitiativesItemMilestonesItemDoneDateRegExp).optional(),
4848
+ "note": stringType().max(createSnapshotBodyInitiativesItemMilestonesItemNoteMax).optional()
4849
+ }).describe("A dated intermediate result (docs/milestones-concept-2026-10-17.md). baselineDate is the agreed plan, forecastDate today's expectation (absent = the baseline), doneDate marks it reached; all yyyy-mm-dd.")).max(createSnapshotBodyInitiativesItemMilestonesMax).optional(),
4693
4850
  "dependsOn": arrayType(stringType()).max(createSnapshotBodyInitiativesItemDependsOnMax),
4694
4851
  "requiredSkills": arrayType(objectType({
4695
4852
  "skillId": stringType(),
4696
4853
  "fte": numberType(),
4697
4854
  "runFte": numberType().min(createSnapshotBodyInitiativesItemRequiredSkillsItemRunFteMin).optional()
4698
4855
  })).max(createSnapshotBodyInitiativesItemRequiredSkillsMax).optional(),
4856
+ "capabilityImpacts": arrayType(objectType({
4857
+ "capabilityId": stringType(),
4858
+ "kind": enumType(["improve", "new", "replace", "retire"]),
4859
+ "maturityTo": numberType().min(1).max(createSnapshotBodyInitiativesItemCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
4860
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(createSnapshotBodyInitiativesItemCapabilityImpactsMax).optional(),
4699
4861
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
4700
4862
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
4701
4863
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
@@ -4706,7 +4868,12 @@ var CreateSnapshotBody = objectType({
4706
4868
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
4707
4869
  "checked": booleanType(),
4708
4870
  "asOfDate": stringType().optional(),
4709
- "note": stringType().max(createSnapshotBodyInitiativesItemGateEvidenceNoteMax).optional()
4871
+ "note": stringType().max(createSnapshotBodyInitiativesItemGateEvidenceNoteMax).optional(),
4872
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
4873
+ "checkedBy": objectType({
4874
+ "userId": stringType().uuid(),
4875
+ "name": stringType()
4876
+ }).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.")
4710
4877
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
4711
4878
  "gateBypassed": booleanType().optional(),
4712
4879
  "aiAct": objectType({
@@ -4789,6 +4956,7 @@ var CreateSnapshotBody = objectType({
4789
4956
  "userId": stringType().uuid(),
4790
4957
  "name": stringType()
4791
4958
  }).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."),
4959
+ "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."),
4792
4960
  "createdAt": stringType(),
4793
4961
  "updatedAt": stringType()
4794
4962
  })),
@@ -4822,9 +4990,17 @@ var renameSnapshotResponseInitiativesItemStatusReportsItemBudgetCommentMax = 1e4
4822
4990
  var renameSnapshotResponseInitiativesItemStatusReportsItemSkillsCommentMax = 1e4;
4823
4991
  var renameSnapshotResponseInitiativesItemStatusReportsItemSummaryMax = 1e4;
4824
4992
  var renameSnapshotResponseInitiativesItemStatusReportsMax = 1e3;
4993
+ var renameSnapshotResponseInitiativesItemMilestonesItemTitleMax = 300;
4994
+ var renameSnapshotResponseInitiativesItemMilestonesItemBaselineDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4995
+ var renameSnapshotResponseInitiativesItemMilestonesItemForecastDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4996
+ var renameSnapshotResponseInitiativesItemMilestonesItemDoneDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
4997
+ var renameSnapshotResponseInitiativesItemMilestonesItemNoteMax = 1e4;
4998
+ var renameSnapshotResponseInitiativesItemMilestonesMax = 30;
4825
4999
  var renameSnapshotResponseInitiativesItemDependsOnMax = 1e3;
4826
5000
  var renameSnapshotResponseInitiativesItemRequiredSkillsItemRunFteMin = 0;
4827
5001
  var renameSnapshotResponseInitiativesItemRequiredSkillsMax = 1e3;
5002
+ var renameSnapshotResponseInitiativesItemCapabilityImpactsItemMaturityToMax = 5;
5003
+ var renameSnapshotResponseInitiativesItemCapabilityImpactsMax = 1e3;
4828
5004
  var renameSnapshotResponseInitiativesItemDpiaUrlMax = 2e3;
4829
5005
  var renameSnapshotResponseInitiativesItemModelCardUrlMax = 2e3;
4830
5006
  var renameSnapshotResponseInitiativesItemProhibitedOverrideMax = 2e3;
@@ -4874,7 +5050,12 @@ var RenameSnapshotResponse = objectType({
4874
5050
  "evaluation": objectType({
4875
5051
  "valueScale": objectType({
4876
5052
  "score": numberType(),
4877
- "confidence": enumType(["Low", "Medium", "High"])
5053
+ "confidence": enumType(["Low", "Medium", "High"]),
5054
+ "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."),
5055
+ "scoredBy": objectType({
5056
+ "userId": stringType().uuid(),
5057
+ "name": stringType()
5058
+ }).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.")
4878
5059
  }).and(objectType({
4879
5060
  "subs": objectType({
4880
5061
  "frequencyOfProcess": numberType(),
@@ -4888,7 +5069,12 @@ var RenameSnapshotResponse = objectType({
4888
5069
  })),
4889
5070
  "feasibility": objectType({
4890
5071
  "score": numberType(),
4891
- "confidence": enumType(["Low", "Medium", "High"])
5072
+ "confidence": enumType(["Low", "Medium", "High"]),
5073
+ "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."),
5074
+ "scoredBy": objectType({
5075
+ "userId": stringType().uuid(),
5076
+ "name": stringType()
5077
+ }).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.")
4892
5078
  }).and(objectType({
4893
5079
  "subs": objectType({
4894
5080
  "dataAvailability": numberType(),
@@ -4902,7 +5088,12 @@ var RenameSnapshotResponse = objectType({
4902
5088
  })),
4903
5089
  "governance": objectType({
4904
5090
  "score": numberType(),
4905
- "confidence": enumType(["Low", "Medium", "High"])
5091
+ "confidence": enumType(["Low", "Medium", "High"]),
5092
+ "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."),
5093
+ "scoredBy": objectType({
5094
+ "userId": stringType().uuid(),
5095
+ "name": stringType()
5096
+ }).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.")
4906
5097
  }).and(objectType({
4907
5098
  "subs": objectType({
4908
5099
  "regulatoryExposure": numberType(),
@@ -4917,7 +5108,12 @@ var RenameSnapshotResponse = objectType({
4917
5108
  })),
4918
5109
  "strategic": objectType({
4919
5110
  "score": numberType(),
4920
- "confidence": enumType(["Low", "Medium", "High"])
5111
+ "confidence": enumType(["Low", "Medium", "High"]),
5112
+ "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."),
5113
+ "scoredBy": objectType({
5114
+ "userId": stringType().uuid(),
5115
+ "name": stringType()
5116
+ }).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.")
4921
5117
  }).and(objectType({
4922
5118
  "subs": objectType({
4923
5119
  "strategicDifferentiation": numberType(),
@@ -4972,7 +5168,12 @@ var RenameSnapshotResponse = objectType({
4972
5168
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
4973
5169
  "owner": stringType().max(renameSnapshotResponseInitiativesItemDecisionLogItemOwnerMax).optional(),
4974
5170
  "rationale": stringType().max(renameSnapshotResponseInitiativesItemDecisionLogItemRationaleMax).optional(),
4975
- "createdAt": stringType().optional()
5171
+ "createdAt": stringType().optional(),
5172
+ "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."),
5173
+ "recordedBy": objectType({
5174
+ "userId": stringType().uuid(),
5175
+ "name": stringType()
5176
+ }).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.")
4976
5177
  })).max(renameSnapshotResponseInitiativesItemDecisionLogMax).optional(),
4977
5178
  "statusReports": arrayType(objectType({
4978
5179
  "id": stringType(),
@@ -4996,12 +5197,25 @@ var RenameSnapshotResponse = objectType({
4996
5197
  }),
4997
5198
  "summary": stringType().max(renameSnapshotResponseInitiativesItemStatusReportsItemSummaryMax).optional()
4998
5199
  })).max(renameSnapshotResponseInitiativesItemStatusReportsMax).optional(),
5200
+ "milestones": arrayType(objectType({
5201
+ "id": stringType(),
5202
+ "title": stringType().min(1).max(renameSnapshotResponseInitiativesItemMilestonesItemTitleMax),
5203
+ "baselineDate": stringType().regex(renameSnapshotResponseInitiativesItemMilestonesItemBaselineDateRegExp),
5204
+ "forecastDate": stringType().regex(renameSnapshotResponseInitiativesItemMilestonesItemForecastDateRegExp).optional(),
5205
+ "doneDate": stringType().regex(renameSnapshotResponseInitiativesItemMilestonesItemDoneDateRegExp).optional(),
5206
+ "note": stringType().max(renameSnapshotResponseInitiativesItemMilestonesItemNoteMax).optional()
5207
+ }).describe("A dated intermediate result (docs/milestones-concept-2026-10-17.md). baselineDate is the agreed plan, forecastDate today's expectation (absent = the baseline), doneDate marks it reached; all yyyy-mm-dd.")).max(renameSnapshotResponseInitiativesItemMilestonesMax).optional(),
4999
5208
  "dependsOn": arrayType(stringType()).max(renameSnapshotResponseInitiativesItemDependsOnMax),
5000
5209
  "requiredSkills": arrayType(objectType({
5001
5210
  "skillId": stringType(),
5002
5211
  "fte": numberType(),
5003
5212
  "runFte": numberType().min(renameSnapshotResponseInitiativesItemRequiredSkillsItemRunFteMin).optional()
5004
5213
  })).max(renameSnapshotResponseInitiativesItemRequiredSkillsMax).optional(),
5214
+ "capabilityImpacts": arrayType(objectType({
5215
+ "capabilityId": stringType(),
5216
+ "kind": enumType(["improve", "new", "replace", "retire"]),
5217
+ "maturityTo": numberType().min(1).max(renameSnapshotResponseInitiativesItemCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
5218
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(renameSnapshotResponseInitiativesItemCapabilityImpactsMax).optional(),
5005
5219
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
5006
5220
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
5007
5221
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
@@ -5012,7 +5226,12 @@ var RenameSnapshotResponse = objectType({
5012
5226
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
5013
5227
  "checked": booleanType(),
5014
5228
  "asOfDate": stringType().optional(),
5015
- "note": stringType().max(renameSnapshotResponseInitiativesItemGateEvidenceNoteMax).optional()
5229
+ "note": stringType().max(renameSnapshotResponseInitiativesItemGateEvidenceNoteMax).optional(),
5230
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
5231
+ "checkedBy": objectType({
5232
+ "userId": stringType().uuid(),
5233
+ "name": stringType()
5234
+ }).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.")
5016
5235
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
5017
5236
  "gateBypassed": booleanType().optional(),
5018
5237
  "aiAct": objectType({
@@ -5095,6 +5314,7 @@ var RenameSnapshotResponse = objectType({
5095
5314
  "userId": stringType().uuid(),
5096
5315
  "name": stringType()
5097
5316
  }).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."),
5317
+ "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."),
5098
5318
  "createdAt": stringType(),
5099
5319
  "updatedAt": stringType()
5100
5320
  })),
@@ -5123,9 +5343,17 @@ var listInitiativesResponseStatusReportsItemBudgetCommentMax = 1e4;
5123
5343
  var listInitiativesResponseStatusReportsItemSkillsCommentMax = 1e4;
5124
5344
  var listInitiativesResponseStatusReportsItemSummaryMax = 1e4;
5125
5345
  var listInitiativesResponseStatusReportsMax = 1e3;
5346
+ var listInitiativesResponseMilestonesItemTitleMax = 300;
5347
+ var listInitiativesResponseMilestonesItemBaselineDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
5348
+ var listInitiativesResponseMilestonesItemForecastDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
5349
+ var listInitiativesResponseMilestonesItemDoneDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
5350
+ var listInitiativesResponseMilestonesItemNoteMax = 1e4;
5351
+ var listInitiativesResponseMilestonesMax = 30;
5126
5352
  var listInitiativesResponseDependsOnMax = 1e3;
5127
5353
  var listInitiativesResponseRequiredSkillsItemRunFteMin = 0;
5128
5354
  var listInitiativesResponseRequiredSkillsMax = 1e3;
5355
+ var listInitiativesResponseCapabilityImpactsItemMaturityToMax = 5;
5356
+ var listInitiativesResponseCapabilityImpactsMax = 1e3;
5129
5357
  var listInitiativesResponseDpiaUrlMax = 2e3;
5130
5358
  var listInitiativesResponseModelCardUrlMax = 2e3;
5131
5359
  var listInitiativesResponseProhibitedOverrideMax = 2e3;
@@ -5169,7 +5397,12 @@ var ListInitiativesResponseItem = objectType({
5169
5397
  "evaluation": objectType({
5170
5398
  "valueScale": objectType({
5171
5399
  "score": numberType(),
5172
- "confidence": enumType(["Low", "Medium", "High"])
5400
+ "confidence": enumType(["Low", "Medium", "High"]),
5401
+ "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."),
5402
+ "scoredBy": objectType({
5403
+ "userId": stringType().uuid(),
5404
+ "name": stringType()
5405
+ }).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.")
5173
5406
  }).and(objectType({
5174
5407
  "subs": objectType({
5175
5408
  "frequencyOfProcess": numberType(),
@@ -5183,7 +5416,12 @@ var ListInitiativesResponseItem = objectType({
5183
5416
  })),
5184
5417
  "feasibility": objectType({
5185
5418
  "score": numberType(),
5186
- "confidence": enumType(["Low", "Medium", "High"])
5419
+ "confidence": enumType(["Low", "Medium", "High"]),
5420
+ "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."),
5421
+ "scoredBy": objectType({
5422
+ "userId": stringType().uuid(),
5423
+ "name": stringType()
5424
+ }).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.")
5187
5425
  }).and(objectType({
5188
5426
  "subs": objectType({
5189
5427
  "dataAvailability": numberType(),
@@ -5197,7 +5435,12 @@ var ListInitiativesResponseItem = objectType({
5197
5435
  })),
5198
5436
  "governance": objectType({
5199
5437
  "score": numberType(),
5200
- "confidence": enumType(["Low", "Medium", "High"])
5438
+ "confidence": enumType(["Low", "Medium", "High"]),
5439
+ "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."),
5440
+ "scoredBy": objectType({
5441
+ "userId": stringType().uuid(),
5442
+ "name": stringType()
5443
+ }).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.")
5201
5444
  }).and(objectType({
5202
5445
  "subs": objectType({
5203
5446
  "regulatoryExposure": numberType(),
@@ -5212,7 +5455,12 @@ var ListInitiativesResponseItem = objectType({
5212
5455
  })),
5213
5456
  "strategic": objectType({
5214
5457
  "score": numberType(),
5215
- "confidence": enumType(["Low", "Medium", "High"])
5458
+ "confidence": enumType(["Low", "Medium", "High"]),
5459
+ "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."),
5460
+ "scoredBy": objectType({
5461
+ "userId": stringType().uuid(),
5462
+ "name": stringType()
5463
+ }).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.")
5216
5464
  }).and(objectType({
5217
5465
  "subs": objectType({
5218
5466
  "strategicDifferentiation": numberType(),
@@ -5267,7 +5515,12 @@ var ListInitiativesResponseItem = objectType({
5267
5515
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
5268
5516
  "owner": stringType().max(listInitiativesResponseDecisionLogItemOwnerMax).optional(),
5269
5517
  "rationale": stringType().max(listInitiativesResponseDecisionLogItemRationaleMax).optional(),
5270
- "createdAt": stringType().optional()
5518
+ "createdAt": stringType().optional(),
5519
+ "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."),
5520
+ "recordedBy": objectType({
5521
+ "userId": stringType().uuid(),
5522
+ "name": stringType()
5523
+ }).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.")
5271
5524
  })).max(listInitiativesResponseDecisionLogMax).optional(),
5272
5525
  "statusReports": arrayType(objectType({
5273
5526
  "id": stringType(),
@@ -5291,12 +5544,25 @@ var ListInitiativesResponseItem = objectType({
5291
5544
  }),
5292
5545
  "summary": stringType().max(listInitiativesResponseStatusReportsItemSummaryMax).optional()
5293
5546
  })).max(listInitiativesResponseStatusReportsMax).optional(),
5547
+ "milestones": arrayType(objectType({
5548
+ "id": stringType(),
5549
+ "title": stringType().min(1).max(listInitiativesResponseMilestonesItemTitleMax),
5550
+ "baselineDate": stringType().regex(listInitiativesResponseMilestonesItemBaselineDateRegExp),
5551
+ "forecastDate": stringType().regex(listInitiativesResponseMilestonesItemForecastDateRegExp).optional(),
5552
+ "doneDate": stringType().regex(listInitiativesResponseMilestonesItemDoneDateRegExp).optional(),
5553
+ "note": stringType().max(listInitiativesResponseMilestonesItemNoteMax).optional()
5554
+ }).describe("A dated intermediate result (docs/milestones-concept-2026-10-17.md). baselineDate is the agreed plan, forecastDate today's expectation (absent = the baseline), doneDate marks it reached; all yyyy-mm-dd.")).max(listInitiativesResponseMilestonesMax).optional(),
5294
5555
  "dependsOn": arrayType(stringType()).max(listInitiativesResponseDependsOnMax),
5295
5556
  "requiredSkills": arrayType(objectType({
5296
5557
  "skillId": stringType(),
5297
5558
  "fte": numberType(),
5298
5559
  "runFte": numberType().min(listInitiativesResponseRequiredSkillsItemRunFteMin).optional()
5299
5560
  })).max(listInitiativesResponseRequiredSkillsMax).optional(),
5561
+ "capabilityImpacts": arrayType(objectType({
5562
+ "capabilityId": stringType(),
5563
+ "kind": enumType(["improve", "new", "replace", "retire"]),
5564
+ "maturityTo": numberType().min(1).max(listInitiativesResponseCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
5565
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(listInitiativesResponseCapabilityImpactsMax).optional(),
5300
5566
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
5301
5567
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
5302
5568
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
@@ -5307,7 +5573,12 @@ var ListInitiativesResponseItem = objectType({
5307
5573
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
5308
5574
  "checked": booleanType(),
5309
5575
  "asOfDate": stringType().optional(),
5310
- "note": stringType().max(listInitiativesResponseGateEvidenceNoteMax).optional()
5576
+ "note": stringType().max(listInitiativesResponseGateEvidenceNoteMax).optional(),
5577
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
5578
+ "checkedBy": objectType({
5579
+ "userId": stringType().uuid(),
5580
+ "name": stringType()
5581
+ }).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.")
5311
5582
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
5312
5583
  "gateBypassed": booleanType().optional(),
5313
5584
  "aiAct": objectType({
@@ -5390,6 +5661,7 @@ var ListInitiativesResponseItem = objectType({
5390
5661
  "userId": stringType().uuid(),
5391
5662
  "name": stringType()
5392
5663
  }).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."),
5664
+ "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."),
5393
5665
  "createdAt": stringType(),
5394
5666
  "updatedAt": stringType()
5395
5667
  });
@@ -5414,9 +5686,17 @@ var createInitiativeBodyOneStatusReportsItemBudgetCommentMax = 1e4;
5414
5686
  var createInitiativeBodyOneStatusReportsItemSkillsCommentMax = 1e4;
5415
5687
  var createInitiativeBodyOneStatusReportsItemSummaryMax = 1e4;
5416
5688
  var createInitiativeBodyOneStatusReportsMax = 1e3;
5689
+ var createInitiativeBodyOneMilestonesItemTitleMax = 300;
5690
+ var createInitiativeBodyOneMilestonesItemBaselineDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
5691
+ var createInitiativeBodyOneMilestonesItemForecastDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
5692
+ var createInitiativeBodyOneMilestonesItemDoneDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
5693
+ var createInitiativeBodyOneMilestonesItemNoteMax = 1e4;
5694
+ var createInitiativeBodyOneMilestonesMax = 30;
5417
5695
  var createInitiativeBodyOneDependsOnMax = 1e3;
5418
5696
  var createInitiativeBodyOneRequiredSkillsItemRunFteMin = 0;
5419
5697
  var createInitiativeBodyOneRequiredSkillsMax = 1e3;
5698
+ var createInitiativeBodyOneCapabilityImpactsItemMaturityToMax = 5;
5699
+ var createInitiativeBodyOneCapabilityImpactsMax = 1e3;
5420
5700
  var createInitiativeBodyOneDpiaUrlMax = 2e3;
5421
5701
  var createInitiativeBodyOneModelCardUrlMax = 2e3;
5422
5702
  var createInitiativeBodyOneProhibitedOverrideMax = 2e3;
@@ -5460,7 +5740,12 @@ var CreateInitiativeBody = objectType({
5460
5740
  "evaluation": objectType({
5461
5741
  "valueScale": objectType({
5462
5742
  "score": numberType(),
5463
- "confidence": enumType(["Low", "Medium", "High"])
5743
+ "confidence": enumType(["Low", "Medium", "High"]),
5744
+ "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."),
5745
+ "scoredBy": objectType({
5746
+ "userId": stringType().uuid(),
5747
+ "name": stringType()
5748
+ }).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.")
5464
5749
  }).and(objectType({
5465
5750
  "subs": objectType({
5466
5751
  "frequencyOfProcess": numberType(),
@@ -5474,7 +5759,12 @@ var CreateInitiativeBody = objectType({
5474
5759
  })),
5475
5760
  "feasibility": objectType({
5476
5761
  "score": numberType(),
5477
- "confidence": enumType(["Low", "Medium", "High"])
5762
+ "confidence": enumType(["Low", "Medium", "High"]),
5763
+ "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."),
5764
+ "scoredBy": objectType({
5765
+ "userId": stringType().uuid(),
5766
+ "name": stringType()
5767
+ }).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.")
5478
5768
  }).and(objectType({
5479
5769
  "subs": objectType({
5480
5770
  "dataAvailability": numberType(),
@@ -5488,7 +5778,12 @@ var CreateInitiativeBody = objectType({
5488
5778
  })),
5489
5779
  "governance": objectType({
5490
5780
  "score": numberType(),
5491
- "confidence": enumType(["Low", "Medium", "High"])
5781
+ "confidence": enumType(["Low", "Medium", "High"]),
5782
+ "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."),
5783
+ "scoredBy": objectType({
5784
+ "userId": stringType().uuid(),
5785
+ "name": stringType()
5786
+ }).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.")
5492
5787
  }).and(objectType({
5493
5788
  "subs": objectType({
5494
5789
  "regulatoryExposure": numberType(),
@@ -5503,7 +5798,12 @@ var CreateInitiativeBody = objectType({
5503
5798
  })),
5504
5799
  "strategic": objectType({
5505
5800
  "score": numberType(),
5506
- "confidence": enumType(["Low", "Medium", "High"])
5801
+ "confidence": enumType(["Low", "Medium", "High"]),
5802
+ "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."),
5803
+ "scoredBy": objectType({
5804
+ "userId": stringType().uuid(),
5805
+ "name": stringType()
5806
+ }).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.")
5507
5807
  }).and(objectType({
5508
5808
  "subs": objectType({
5509
5809
  "strategicDifferentiation": numberType(),
@@ -5558,7 +5858,12 @@ var CreateInitiativeBody = objectType({
5558
5858
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
5559
5859
  "owner": stringType().max(createInitiativeBodyOneDecisionLogItemOwnerMax).optional(),
5560
5860
  "rationale": stringType().max(createInitiativeBodyOneDecisionLogItemRationaleMax).optional(),
5561
- "createdAt": stringType().optional()
5861
+ "createdAt": stringType().optional(),
5862
+ "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."),
5863
+ "recordedBy": objectType({
5864
+ "userId": stringType().uuid(),
5865
+ "name": stringType()
5866
+ }).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.")
5562
5867
  })).max(createInitiativeBodyOneDecisionLogMax).optional(),
5563
5868
  "statusReports": arrayType(objectType({
5564
5869
  "id": stringType(),
@@ -5582,12 +5887,25 @@ var CreateInitiativeBody = objectType({
5582
5887
  }),
5583
5888
  "summary": stringType().max(createInitiativeBodyOneStatusReportsItemSummaryMax).optional()
5584
5889
  })).max(createInitiativeBodyOneStatusReportsMax).optional(),
5890
+ "milestones": arrayType(objectType({
5891
+ "id": stringType(),
5892
+ "title": stringType().min(1).max(createInitiativeBodyOneMilestonesItemTitleMax),
5893
+ "baselineDate": stringType().regex(createInitiativeBodyOneMilestonesItemBaselineDateRegExp),
5894
+ "forecastDate": stringType().regex(createInitiativeBodyOneMilestonesItemForecastDateRegExp).optional(),
5895
+ "doneDate": stringType().regex(createInitiativeBodyOneMilestonesItemDoneDateRegExp).optional(),
5896
+ "note": stringType().max(createInitiativeBodyOneMilestonesItemNoteMax).optional()
5897
+ }).describe("A dated intermediate result (docs/milestones-concept-2026-10-17.md). baselineDate is the agreed plan, forecastDate today's expectation (absent = the baseline), doneDate marks it reached; all yyyy-mm-dd.")).max(createInitiativeBodyOneMilestonesMax).optional(),
5585
5898
  "dependsOn": arrayType(stringType()).max(createInitiativeBodyOneDependsOnMax),
5586
5899
  "requiredSkills": arrayType(objectType({
5587
5900
  "skillId": stringType(),
5588
5901
  "fte": numberType(),
5589
5902
  "runFte": numberType().min(createInitiativeBodyOneRequiredSkillsItemRunFteMin).optional()
5590
5903
  })).max(createInitiativeBodyOneRequiredSkillsMax).optional(),
5904
+ "capabilityImpacts": arrayType(objectType({
5905
+ "capabilityId": stringType(),
5906
+ "kind": enumType(["improve", "new", "replace", "retire"]),
5907
+ "maturityTo": numberType().min(1).max(createInitiativeBodyOneCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
5908
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(createInitiativeBodyOneCapabilityImpactsMax).optional(),
5591
5909
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
5592
5910
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
5593
5911
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
@@ -5598,7 +5916,12 @@ var CreateInitiativeBody = objectType({
5598
5916
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
5599
5917
  "checked": booleanType(),
5600
5918
  "asOfDate": stringType().optional(),
5601
- "note": stringType().max(createInitiativeBodyOneGateEvidenceNoteMax).optional()
5919
+ "note": stringType().max(createInitiativeBodyOneGateEvidenceNoteMax).optional(),
5920
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
5921
+ "checkedBy": objectType({
5922
+ "userId": stringType().uuid(),
5923
+ "name": stringType()
5924
+ }).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.")
5602
5925
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
5603
5926
  "gateBypassed": booleanType().optional(),
5604
5927
  "aiAct": objectType({
@@ -5681,6 +6004,7 @@ var CreateInitiativeBody = objectType({
5681
6004
  "userId": stringType().uuid(),
5682
6005
  "name": stringType()
5683
6006
  }).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."),
6007
+ "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."),
5684
6008
  "createdAt": stringType(),
5685
6009
  "updatedAt": stringType()
5686
6010
  }).and(objectType({
@@ -5688,7 +6012,9 @@ var CreateInitiativeBody = objectType({
5688
6012
  "createdBy": unknownType().optional(),
5689
6013
  "updatedBy": unknownType().optional(),
5690
6014
  "createdAt": unknownType().optional(),
5691
- "updatedAt": unknownType().optional()
6015
+ "updatedAt": unknownType().optional(),
6016
+ "version": unknownType().optional(),
6017
+ "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.")
5692
6018
  })).describe("Same as Initiative, minus server-assigned fields.");
5693
6019
  var GetInitiativeParams = objectType({
5694
6020
  "id": coerce.string().uuid()
@@ -5713,9 +6039,17 @@ var getInitiativeResponseStatusReportsItemBudgetCommentMax = 1e4;
5713
6039
  var getInitiativeResponseStatusReportsItemSkillsCommentMax = 1e4;
5714
6040
  var getInitiativeResponseStatusReportsItemSummaryMax = 1e4;
5715
6041
  var getInitiativeResponseStatusReportsMax = 1e3;
6042
+ var getInitiativeResponseMilestonesItemTitleMax = 300;
6043
+ var getInitiativeResponseMilestonesItemBaselineDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6044
+ var getInitiativeResponseMilestonesItemForecastDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6045
+ var getInitiativeResponseMilestonesItemDoneDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6046
+ var getInitiativeResponseMilestonesItemNoteMax = 1e4;
6047
+ var getInitiativeResponseMilestonesMax = 30;
5716
6048
  var getInitiativeResponseDependsOnMax = 1e3;
5717
6049
  var getInitiativeResponseRequiredSkillsItemRunFteMin = 0;
5718
6050
  var getInitiativeResponseRequiredSkillsMax = 1e3;
6051
+ var getInitiativeResponseCapabilityImpactsItemMaturityToMax = 5;
6052
+ var getInitiativeResponseCapabilityImpactsMax = 1e3;
5719
6053
  var getInitiativeResponseDpiaUrlMax = 2e3;
5720
6054
  var getInitiativeResponseModelCardUrlMax = 2e3;
5721
6055
  var getInitiativeResponseProhibitedOverrideMax = 2e3;
@@ -5759,7 +6093,12 @@ var GetInitiativeResponse = objectType({
5759
6093
  "evaluation": objectType({
5760
6094
  "valueScale": objectType({
5761
6095
  "score": numberType(),
5762
- "confidence": enumType(["Low", "Medium", "High"])
6096
+ "confidence": enumType(["Low", "Medium", "High"]),
6097
+ "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."),
6098
+ "scoredBy": objectType({
6099
+ "userId": stringType().uuid(),
6100
+ "name": stringType()
6101
+ }).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.")
5763
6102
  }).and(objectType({
5764
6103
  "subs": objectType({
5765
6104
  "frequencyOfProcess": numberType(),
@@ -5773,7 +6112,12 @@ var GetInitiativeResponse = objectType({
5773
6112
  })),
5774
6113
  "feasibility": objectType({
5775
6114
  "score": numberType(),
5776
- "confidence": enumType(["Low", "Medium", "High"])
6115
+ "confidence": enumType(["Low", "Medium", "High"]),
6116
+ "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."),
6117
+ "scoredBy": objectType({
6118
+ "userId": stringType().uuid(),
6119
+ "name": stringType()
6120
+ }).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.")
5777
6121
  }).and(objectType({
5778
6122
  "subs": objectType({
5779
6123
  "dataAvailability": numberType(),
@@ -5787,7 +6131,12 @@ var GetInitiativeResponse = objectType({
5787
6131
  })),
5788
6132
  "governance": objectType({
5789
6133
  "score": numberType(),
5790
- "confidence": enumType(["Low", "Medium", "High"])
6134
+ "confidence": enumType(["Low", "Medium", "High"]),
6135
+ "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."),
6136
+ "scoredBy": objectType({
6137
+ "userId": stringType().uuid(),
6138
+ "name": stringType()
6139
+ }).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.")
5791
6140
  }).and(objectType({
5792
6141
  "subs": objectType({
5793
6142
  "regulatoryExposure": numberType(),
@@ -5802,7 +6151,12 @@ var GetInitiativeResponse = objectType({
5802
6151
  })),
5803
6152
  "strategic": objectType({
5804
6153
  "score": numberType(),
5805
- "confidence": enumType(["Low", "Medium", "High"])
6154
+ "confidence": enumType(["Low", "Medium", "High"]),
6155
+ "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."),
6156
+ "scoredBy": objectType({
6157
+ "userId": stringType().uuid(),
6158
+ "name": stringType()
6159
+ }).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.")
5806
6160
  }).and(objectType({
5807
6161
  "subs": objectType({
5808
6162
  "strategicDifferentiation": numberType(),
@@ -5857,7 +6211,12 @@ var GetInitiativeResponse = objectType({
5857
6211
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
5858
6212
  "owner": stringType().max(getInitiativeResponseDecisionLogItemOwnerMax).optional(),
5859
6213
  "rationale": stringType().max(getInitiativeResponseDecisionLogItemRationaleMax).optional(),
5860
- "createdAt": stringType().optional()
6214
+ "createdAt": stringType().optional(),
6215
+ "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."),
6216
+ "recordedBy": objectType({
6217
+ "userId": stringType().uuid(),
6218
+ "name": stringType()
6219
+ }).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.")
5861
6220
  })).max(getInitiativeResponseDecisionLogMax).optional(),
5862
6221
  "statusReports": arrayType(objectType({
5863
6222
  "id": stringType(),
@@ -5881,12 +6240,25 @@ var GetInitiativeResponse = objectType({
5881
6240
  }),
5882
6241
  "summary": stringType().max(getInitiativeResponseStatusReportsItemSummaryMax).optional()
5883
6242
  })).max(getInitiativeResponseStatusReportsMax).optional(),
6243
+ "milestones": arrayType(objectType({
6244
+ "id": stringType(),
6245
+ "title": stringType().min(1).max(getInitiativeResponseMilestonesItemTitleMax),
6246
+ "baselineDate": stringType().regex(getInitiativeResponseMilestonesItemBaselineDateRegExp),
6247
+ "forecastDate": stringType().regex(getInitiativeResponseMilestonesItemForecastDateRegExp).optional(),
6248
+ "doneDate": stringType().regex(getInitiativeResponseMilestonesItemDoneDateRegExp).optional(),
6249
+ "note": stringType().max(getInitiativeResponseMilestonesItemNoteMax).optional()
6250
+ }).describe("A dated intermediate result (docs/milestones-concept-2026-10-17.md). baselineDate is the agreed plan, forecastDate today's expectation (absent = the baseline), doneDate marks it reached; all yyyy-mm-dd.")).max(getInitiativeResponseMilestonesMax).optional(),
5884
6251
  "dependsOn": arrayType(stringType()).max(getInitiativeResponseDependsOnMax),
5885
6252
  "requiredSkills": arrayType(objectType({
5886
6253
  "skillId": stringType(),
5887
6254
  "fte": numberType(),
5888
6255
  "runFte": numberType().min(getInitiativeResponseRequiredSkillsItemRunFteMin).optional()
5889
6256
  })).max(getInitiativeResponseRequiredSkillsMax).optional(),
6257
+ "capabilityImpacts": arrayType(objectType({
6258
+ "capabilityId": stringType(),
6259
+ "kind": enumType(["improve", "new", "replace", "retire"]),
6260
+ "maturityTo": numberType().min(1).max(getInitiativeResponseCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
6261
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(getInitiativeResponseCapabilityImpactsMax).optional(),
5890
6262
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
5891
6263
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
5892
6264
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
@@ -5897,7 +6269,12 @@ var GetInitiativeResponse = objectType({
5897
6269
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
5898
6270
  "checked": booleanType(),
5899
6271
  "asOfDate": stringType().optional(),
5900
- "note": stringType().max(getInitiativeResponseGateEvidenceNoteMax).optional()
6272
+ "note": stringType().max(getInitiativeResponseGateEvidenceNoteMax).optional(),
6273
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
6274
+ "checkedBy": objectType({
6275
+ "userId": stringType().uuid(),
6276
+ "name": stringType()
6277
+ }).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.")
5901
6278
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
5902
6279
  "gateBypassed": booleanType().optional(),
5903
6280
  "aiAct": objectType({
@@ -5980,6 +6357,7 @@ var GetInitiativeResponse = objectType({
5980
6357
  "userId": stringType().uuid(),
5981
6358
  "name": stringType()
5982
6359
  }).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."),
6360
+ "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."),
5983
6361
  "createdAt": stringType(),
5984
6362
  "updatedAt": stringType()
5985
6363
  });
@@ -6006,9 +6384,17 @@ var updateInitiativeBodyOneStatusReportsItemBudgetCommentMax = 1e4;
6006
6384
  var updateInitiativeBodyOneStatusReportsItemSkillsCommentMax = 1e4;
6007
6385
  var updateInitiativeBodyOneStatusReportsItemSummaryMax = 1e4;
6008
6386
  var updateInitiativeBodyOneStatusReportsMax = 1e3;
6387
+ var updateInitiativeBodyOneMilestonesItemTitleMax = 300;
6388
+ var updateInitiativeBodyOneMilestonesItemBaselineDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6389
+ var updateInitiativeBodyOneMilestonesItemForecastDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6390
+ var updateInitiativeBodyOneMilestonesItemDoneDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6391
+ var updateInitiativeBodyOneMilestonesItemNoteMax = 1e4;
6392
+ var updateInitiativeBodyOneMilestonesMax = 30;
6009
6393
  var updateInitiativeBodyOneDependsOnMax = 1e3;
6010
6394
  var updateInitiativeBodyOneRequiredSkillsItemRunFteMin = 0;
6011
6395
  var updateInitiativeBodyOneRequiredSkillsMax = 1e3;
6396
+ var updateInitiativeBodyOneCapabilityImpactsItemMaturityToMax = 5;
6397
+ var updateInitiativeBodyOneCapabilityImpactsMax = 1e3;
6012
6398
  var updateInitiativeBodyOneDpiaUrlMax = 2e3;
6013
6399
  var updateInitiativeBodyOneModelCardUrlMax = 2e3;
6014
6400
  var updateInitiativeBodyOneProhibitedOverrideMax = 2e3;
@@ -6052,7 +6438,12 @@ var UpdateInitiativeBody = objectType({
6052
6438
  "evaluation": objectType({
6053
6439
  "valueScale": objectType({
6054
6440
  "score": numberType(),
6055
- "confidence": enumType(["Low", "Medium", "High"])
6441
+ "confidence": enumType(["Low", "Medium", "High"]),
6442
+ "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."),
6443
+ "scoredBy": objectType({
6444
+ "userId": stringType().uuid(),
6445
+ "name": stringType()
6446
+ }).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.")
6056
6447
  }).and(objectType({
6057
6448
  "subs": objectType({
6058
6449
  "frequencyOfProcess": numberType(),
@@ -6066,7 +6457,12 @@ var UpdateInitiativeBody = objectType({
6066
6457
  })),
6067
6458
  "feasibility": objectType({
6068
6459
  "score": numberType(),
6069
- "confidence": enumType(["Low", "Medium", "High"])
6460
+ "confidence": enumType(["Low", "Medium", "High"]),
6461
+ "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."),
6462
+ "scoredBy": objectType({
6463
+ "userId": stringType().uuid(),
6464
+ "name": stringType()
6465
+ }).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.")
6070
6466
  }).and(objectType({
6071
6467
  "subs": objectType({
6072
6468
  "dataAvailability": numberType(),
@@ -6080,7 +6476,12 @@ var UpdateInitiativeBody = objectType({
6080
6476
  })),
6081
6477
  "governance": objectType({
6082
6478
  "score": numberType(),
6083
- "confidence": enumType(["Low", "Medium", "High"])
6479
+ "confidence": enumType(["Low", "Medium", "High"]),
6480
+ "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."),
6481
+ "scoredBy": objectType({
6482
+ "userId": stringType().uuid(),
6483
+ "name": stringType()
6484
+ }).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.")
6084
6485
  }).and(objectType({
6085
6486
  "subs": objectType({
6086
6487
  "regulatoryExposure": numberType(),
@@ -6095,7 +6496,12 @@ var UpdateInitiativeBody = objectType({
6095
6496
  })),
6096
6497
  "strategic": objectType({
6097
6498
  "score": numberType(),
6098
- "confidence": enumType(["Low", "Medium", "High"])
6499
+ "confidence": enumType(["Low", "Medium", "High"]),
6500
+ "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."),
6501
+ "scoredBy": objectType({
6502
+ "userId": stringType().uuid(),
6503
+ "name": stringType()
6504
+ }).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.")
6099
6505
  }).and(objectType({
6100
6506
  "subs": objectType({
6101
6507
  "strategicDifferentiation": numberType(),
@@ -6150,7 +6556,12 @@ var UpdateInitiativeBody = objectType({
6150
6556
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
6151
6557
  "owner": stringType().max(updateInitiativeBodyOneDecisionLogItemOwnerMax).optional(),
6152
6558
  "rationale": stringType().max(updateInitiativeBodyOneDecisionLogItemRationaleMax).optional(),
6153
- "createdAt": stringType().optional()
6559
+ "createdAt": stringType().optional(),
6560
+ "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."),
6561
+ "recordedBy": objectType({
6562
+ "userId": stringType().uuid(),
6563
+ "name": stringType()
6564
+ }).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.")
6154
6565
  })).max(updateInitiativeBodyOneDecisionLogMax).optional(),
6155
6566
  "statusReports": arrayType(objectType({
6156
6567
  "id": stringType(),
@@ -6174,12 +6585,25 @@ var UpdateInitiativeBody = objectType({
6174
6585
  }),
6175
6586
  "summary": stringType().max(updateInitiativeBodyOneStatusReportsItemSummaryMax).optional()
6176
6587
  })).max(updateInitiativeBodyOneStatusReportsMax).optional(),
6588
+ "milestones": arrayType(objectType({
6589
+ "id": stringType(),
6590
+ "title": stringType().min(1).max(updateInitiativeBodyOneMilestonesItemTitleMax),
6591
+ "baselineDate": stringType().regex(updateInitiativeBodyOneMilestonesItemBaselineDateRegExp),
6592
+ "forecastDate": stringType().regex(updateInitiativeBodyOneMilestonesItemForecastDateRegExp).optional(),
6593
+ "doneDate": stringType().regex(updateInitiativeBodyOneMilestonesItemDoneDateRegExp).optional(),
6594
+ "note": stringType().max(updateInitiativeBodyOneMilestonesItemNoteMax).optional()
6595
+ }).describe("A dated intermediate result (docs/milestones-concept-2026-10-17.md). baselineDate is the agreed plan, forecastDate today's expectation (absent = the baseline), doneDate marks it reached; all yyyy-mm-dd.")).max(updateInitiativeBodyOneMilestonesMax).optional(),
6177
6596
  "dependsOn": arrayType(stringType()).max(updateInitiativeBodyOneDependsOnMax),
6178
6597
  "requiredSkills": arrayType(objectType({
6179
6598
  "skillId": stringType(),
6180
6599
  "fte": numberType(),
6181
6600
  "runFte": numberType().min(updateInitiativeBodyOneRequiredSkillsItemRunFteMin).optional()
6182
6601
  })).max(updateInitiativeBodyOneRequiredSkillsMax).optional(),
6602
+ "capabilityImpacts": arrayType(objectType({
6603
+ "capabilityId": stringType(),
6604
+ "kind": enumType(["improve", "new", "replace", "retire"]),
6605
+ "maturityTo": numberType().min(1).max(updateInitiativeBodyOneCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
6606
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(updateInitiativeBodyOneCapabilityImpactsMax).optional(),
6183
6607
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
6184
6608
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
6185
6609
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
@@ -6190,7 +6614,12 @@ var UpdateInitiativeBody = objectType({
6190
6614
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
6191
6615
  "checked": booleanType(),
6192
6616
  "asOfDate": stringType().optional(),
6193
- "note": stringType().max(updateInitiativeBodyOneGateEvidenceNoteMax).optional()
6617
+ "note": stringType().max(updateInitiativeBodyOneGateEvidenceNoteMax).optional(),
6618
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
6619
+ "checkedBy": objectType({
6620
+ "userId": stringType().uuid(),
6621
+ "name": stringType()
6622
+ }).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.")
6194
6623
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
6195
6624
  "gateBypassed": booleanType().optional(),
6196
6625
  "aiAct": objectType({
@@ -6273,6 +6702,7 @@ var UpdateInitiativeBody = objectType({
6273
6702
  "userId": stringType().uuid(),
6274
6703
  "name": stringType()
6275
6704
  }).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."),
6705
+ "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."),
6276
6706
  "createdAt": stringType(),
6277
6707
  "updatedAt": stringType()
6278
6708
  }).and(objectType({
@@ -6280,7 +6710,9 @@ var UpdateInitiativeBody = objectType({
6280
6710
  "createdBy": unknownType().optional(),
6281
6711
  "updatedBy": unknownType().optional(),
6282
6712
  "createdAt": unknownType().optional(),
6283
- "updatedAt": unknownType().optional()
6713
+ "updatedAt": unknownType().optional(),
6714
+ "version": unknownType().optional(),
6715
+ "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.")
6284
6716
  })).describe("Same as Initiative, minus server-assigned fields.");
6285
6717
  var updateInitiativeResponseNameMax = 200;
6286
6718
  var updateInitiativeResponseExternalIdMax = 200;
@@ -6302,9 +6734,17 @@ var updateInitiativeResponseStatusReportsItemBudgetCommentMax = 1e4;
6302
6734
  var updateInitiativeResponseStatusReportsItemSkillsCommentMax = 1e4;
6303
6735
  var updateInitiativeResponseStatusReportsItemSummaryMax = 1e4;
6304
6736
  var updateInitiativeResponseStatusReportsMax = 1e3;
6737
+ var updateInitiativeResponseMilestonesItemTitleMax = 300;
6738
+ var updateInitiativeResponseMilestonesItemBaselineDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6739
+ var updateInitiativeResponseMilestonesItemForecastDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6740
+ var updateInitiativeResponseMilestonesItemDoneDateRegExp = new RegExp("^\\d{4}-\\d{2}-\\d{2}$");
6741
+ var updateInitiativeResponseMilestonesItemNoteMax = 1e4;
6742
+ var updateInitiativeResponseMilestonesMax = 30;
6305
6743
  var updateInitiativeResponseDependsOnMax = 1e3;
6306
6744
  var updateInitiativeResponseRequiredSkillsItemRunFteMin = 0;
6307
6745
  var updateInitiativeResponseRequiredSkillsMax = 1e3;
6746
+ var updateInitiativeResponseCapabilityImpactsItemMaturityToMax = 5;
6747
+ var updateInitiativeResponseCapabilityImpactsMax = 1e3;
6308
6748
  var updateInitiativeResponseDpiaUrlMax = 2e3;
6309
6749
  var updateInitiativeResponseModelCardUrlMax = 2e3;
6310
6750
  var updateInitiativeResponseProhibitedOverrideMax = 2e3;
@@ -6348,7 +6788,12 @@ var UpdateInitiativeResponse = objectType({
6348
6788
  "evaluation": objectType({
6349
6789
  "valueScale": objectType({
6350
6790
  "score": numberType(),
6351
- "confidence": enumType(["Low", "Medium", "High"])
6791
+ "confidence": enumType(["Low", "Medium", "High"]),
6792
+ "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."),
6793
+ "scoredBy": objectType({
6794
+ "userId": stringType().uuid(),
6795
+ "name": stringType()
6796
+ }).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.")
6352
6797
  }).and(objectType({
6353
6798
  "subs": objectType({
6354
6799
  "frequencyOfProcess": numberType(),
@@ -6362,7 +6807,12 @@ var UpdateInitiativeResponse = objectType({
6362
6807
  })),
6363
6808
  "feasibility": objectType({
6364
6809
  "score": numberType(),
6365
- "confidence": enumType(["Low", "Medium", "High"])
6810
+ "confidence": enumType(["Low", "Medium", "High"]),
6811
+ "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."),
6812
+ "scoredBy": objectType({
6813
+ "userId": stringType().uuid(),
6814
+ "name": stringType()
6815
+ }).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.")
6366
6816
  }).and(objectType({
6367
6817
  "subs": objectType({
6368
6818
  "dataAvailability": numberType(),
@@ -6376,7 +6826,12 @@ var UpdateInitiativeResponse = objectType({
6376
6826
  })),
6377
6827
  "governance": objectType({
6378
6828
  "score": numberType(),
6379
- "confidence": enumType(["Low", "Medium", "High"])
6829
+ "confidence": enumType(["Low", "Medium", "High"]),
6830
+ "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."),
6831
+ "scoredBy": objectType({
6832
+ "userId": stringType().uuid(),
6833
+ "name": stringType()
6834
+ }).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.")
6380
6835
  }).and(objectType({
6381
6836
  "subs": objectType({
6382
6837
  "regulatoryExposure": numberType(),
@@ -6391,7 +6846,12 @@ var UpdateInitiativeResponse = objectType({
6391
6846
  })),
6392
6847
  "strategic": objectType({
6393
6848
  "score": numberType(),
6394
- "confidence": enumType(["Low", "Medium", "High"])
6849
+ "confidence": enumType(["Low", "Medium", "High"]),
6850
+ "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."),
6851
+ "scoredBy": objectType({
6852
+ "userId": stringType().uuid(),
6853
+ "name": stringType()
6854
+ }).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.")
6395
6855
  }).and(objectType({
6396
6856
  "subs": objectType({
6397
6857
  "strategicDifferentiation": numberType(),
@@ -6446,7 +6906,12 @@ var UpdateInitiativeResponse = objectType({
6446
6906
  "kind": enumType(["go", "pause", "stop", "rescope", "rebudget", "other"]),
6447
6907
  "owner": stringType().max(updateInitiativeResponseDecisionLogItemOwnerMax).optional(),
6448
6908
  "rationale": stringType().max(updateInitiativeResponseDecisionLogItemRationaleMax).optional(),
6449
- "createdAt": stringType().optional()
6909
+ "createdAt": stringType().optional(),
6910
+ "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."),
6911
+ "recordedBy": objectType({
6912
+ "userId": stringType().uuid(),
6913
+ "name": stringType()
6914
+ }).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.")
6450
6915
  })).max(updateInitiativeResponseDecisionLogMax).optional(),
6451
6916
  "statusReports": arrayType(objectType({
6452
6917
  "id": stringType(),
@@ -6470,12 +6935,25 @@ var UpdateInitiativeResponse = objectType({
6470
6935
  }),
6471
6936
  "summary": stringType().max(updateInitiativeResponseStatusReportsItemSummaryMax).optional()
6472
6937
  })).max(updateInitiativeResponseStatusReportsMax).optional(),
6938
+ "milestones": arrayType(objectType({
6939
+ "id": stringType(),
6940
+ "title": stringType().min(1).max(updateInitiativeResponseMilestonesItemTitleMax),
6941
+ "baselineDate": stringType().regex(updateInitiativeResponseMilestonesItemBaselineDateRegExp),
6942
+ "forecastDate": stringType().regex(updateInitiativeResponseMilestonesItemForecastDateRegExp).optional(),
6943
+ "doneDate": stringType().regex(updateInitiativeResponseMilestonesItemDoneDateRegExp).optional(),
6944
+ "note": stringType().max(updateInitiativeResponseMilestonesItemNoteMax).optional()
6945
+ }).describe("A dated intermediate result (docs/milestones-concept-2026-10-17.md). baselineDate is the agreed plan, forecastDate today's expectation (absent = the baseline), doneDate marks it reached; all yyyy-mm-dd.")).max(updateInitiativeResponseMilestonesMax).optional(),
6473
6946
  "dependsOn": arrayType(stringType()).max(updateInitiativeResponseDependsOnMax),
6474
6947
  "requiredSkills": arrayType(objectType({
6475
6948
  "skillId": stringType(),
6476
6949
  "fte": numberType(),
6477
6950
  "runFte": numberType().min(updateInitiativeResponseRequiredSkillsItemRunFteMin).optional()
6478
6951
  })).max(updateInitiativeResponseRequiredSkillsMax).optional(),
6952
+ "capabilityImpacts": arrayType(objectType({
6953
+ "capabilityId": stringType(),
6954
+ "kind": enumType(["improve", "new", "replace", "retire"]),
6955
+ "maturityTo": numberType().min(1).max(updateInitiativeResponseCapabilityImpactsItemMaturityToMax).optional().describe("The maturity level the initiative brings the capability to; absent for `retire`.")
6956
+ }).describe("What an initiative does to one capability of the organisation's map.")).max(updateInitiativeResponseCapabilityImpactsMax).optional(),
6479
6957
  "aiRiskTier": enumType(["Prohibited", "High-Risk", "Limited", "Minimal"]).optional(),
6480
6958
  "hitlPosture": enumType(["Unattended", "Supervised", "Human-Required"]).optional(),
6481
6959
  "dpiaStatus": enumType(["Not Required", "In Progress", "Completed"]).optional(),
@@ -6486,7 +6964,12 @@ var UpdateInitiativeResponse = objectType({
6486
6964
  "gateEvidence": recordType(stringType(), recordType(stringType(), objectType({
6487
6965
  "checked": booleanType(),
6488
6966
  "asOfDate": stringType().optional(),
6489
- "note": stringType().max(updateInitiativeResponseGateEvidenceNoteMax).optional()
6967
+ "note": stringType().max(updateInitiativeResponseGateEvidenceNoteMax).optional(),
6968
+ "checkedAt": stringType().optional().describe("Server stamp: when the item was ticked; absent while unchecked or ticked before the stamps were introduced. Ignored in requests."),
6969
+ "checkedBy": objectType({
6970
+ "userId": stringType().uuid(),
6971
+ "name": stringType()
6972
+ }).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.")
6490
6973
  }))).optional().describe("Partial<Record<GateTransitionKey, Record<itemId, GateEvidenceItem>>>"),
6491
6974
  "gateBypassed": booleanType().optional(),
6492
6975
  "aiAct": objectType({
@@ -6569,6 +7052,7 @@ var UpdateInitiativeResponse = objectType({
6569
7052
  "userId": stringType().uuid(),
6570
7053
  "name": stringType()
6571
7054
  }).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."),
7055
+ "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."),
6572
7056
  "createdAt": stringType(),
6573
7057
  "updatedAt": stringType()
6574
7058
  });
@@ -6605,7 +7089,7 @@ var ListAdminAuditLogQueryParams = objectType({
6605
7089
  });
6606
7090
  var ListAdminAuditLogResponseItem = objectType({
6607
7091
  "id": stringType().uuid(),
6608
- "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", "organization.renamed", "user.erased"]),
7092
+ "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"]),
6609
7093
  "targetType": stringType(),
6610
7094
  "targetId": stringType().nullable(),
6611
7095
  "actorName": stringType().nullable(),
@@ -6711,6 +7195,9 @@ var GATE_TRANSITIONS = [
6711
7195
  { key: "scaling-production", from: "Scaling", to: "In Production" }
6712
7196
  ];
6713
7197
  var GATE_TRANSITION_KEYS = GATE_TRANSITIONS.map((t) => t.key);
7198
+ var CAPABILITY_IMPORTANCES = ["differentiating", "core", "supporting"];
7199
+ var CAPABILITY_MATURITY_MIN = 1;
7200
+ var CAPABILITY_MATURITY_MAX = 5;
6714
7201
  var ANNEX_III_CATEGORIES = [
6715
7202
  "Biometrics",
6716
7203
  "Critical Infrastructure",
@@ -6841,6 +7328,7 @@ var EN_DIGITAL = {
6841
7328
  "govLabel.Controlled Automation": "Controlled Operation",
6842
7329
  "govLabel.Human-in-the-Loop Required": "Supervised Operation Required",
6843
7330
  "govLabel.Restricted Deployment": "Restricted Rollout",
7331
+ "memo.governance.intro": "{count} initiatives sit in the Restricted Rollout band or above (governance \u2265 61/100) and require active board-level monitoring.",
6844
7332
  "subHelp.modelRobustness": "Stability of the solution under load, edge cases and unexpected inputs.",
6845
7333
  "subHelp.reproducibility": "Maturity of the underlying cloud / platform stack \u2014 proven and supported (managed services, mature regions, SLAs) vs experimental or self-hosted.",
6846
7334
  "subHelp.explainability": "How clearly the system's behaviour and outputs can be explained to operators and end-users.",
@@ -7057,6 +7545,7 @@ var DE_DIGITAL = {
7057
7545
  "govLabel.Controlled Automation": "Kontrollierter Betrieb",
7058
7546
  "govLabel.Human-in-the-Loop Required": "Beaufsichtigter Betrieb erforderlich",
7059
7547
  "govLabel.Restricted Deployment": "Eingeschr\xE4nkter Rollout",
7548
+ "memo.governance.intro": "{count} Initiativen liegen im Band \u201EEingeschr\xE4nkter Rollout\u201C oder dar\xFCber (Governance \u2265 61/100) und ben\xF6tigen aktive Vorstandsaufsicht.",
7060
7549
  "subHelp.modelRobustness": "Stabilit\xE4t der L\xF6sung unter Last, bei Edge-Cases und unerwarteten Eingaben.",
7061
7550
  "subHelp.reproducibility": "Reife des zugrundeliegenden Cloud-/Plattform-Stacks \u2014 bew\xE4hrt und supportet (Managed Services, etablierte Regionen, SLAs) vs. experimentell oder selbstgehostet.",
7062
7551
  "subHelp.explainability": "Wie klar Verhalten und Ergebnisse des Systems Betreibern und Endnutzern erkl\xE4rbar sind.",
@@ -7273,6 +7762,7 @@ var EN_INNOVATION = {
7273
7762
  "govLabel.Controlled Automation": "Monitored Trial",
7274
7763
  "govLabel.Human-in-the-Loop Required": "Active Stewardship Required",
7275
7764
  "govLabel.Restricted Deployment": "Bounded Pilot Only",
7765
+ "memo.governance.intro": "{count} initiatives sit in the Bounded Pilot Only band or above (governance \u2265 61/100) and require active board-level monitoring.",
7276
7766
  "govLabel.High Governance Sensitivity": "Board-Level Sponsorship Required",
7277
7767
  "subHelp.modelRobustness": "How well the core concept holds up under stress, edge cases and pessimistic assumptions.",
7278
7768
  "subHelp.reproducibility": "Likelihood that observed results would repeat under independent conditions.",
@@ -7538,6 +8028,7 @@ var DE_INNOVATION = {
7538
8028
  "govLabel.Controlled Automation": "\xDCberwachte Erprobung",
7539
8029
  "govLabel.Human-in-the-Loop Required": "Aktive Begleitung erforderlich",
7540
8030
  "govLabel.Restricted Deployment": "Nur eingegrenzter Pilot",
8031
+ "memo.governance.intro": "{count} Initiativen liegen im Band \u201ENur eingegrenzter Pilot\u201C oder dar\xFCber (Governance \u2265 61/100) und ben\xF6tigen aktive Vorstandsaufsicht.",
7541
8032
  "govLabel.High Governance Sensitivity": "Vorstandspatenschaft erforderlich",
7542
8033
  "subHelp.modelRobustness": "Wie gut das Kernkonzept Belastung, Edge-Cases und pessimistische Annahmen aush\xE4lt.",
7543
8034
  "subHelp.reproducibility": "Wahrscheinlichkeit, dass beobachtete Ergebnisse unter unabh\xE4ngigen Bedingungen wiederholbar sind.",
@@ -9055,6 +9546,20 @@ var OPTIONAL_SECTIONS = [
9055
9546
  { key: "economics", hint: { en: "Benefit/cost P10/P50/P90 ranges, ramp, confidence, discount rate", de: "Nutzen/Kosten P10/P50/P90, Ramp, Konfidenz, Diskontsatz" } },
9056
9547
  { key: "decisionLog", hint: { en: "Dated decisions (go/pause/stop/rescope/rebudget/other)", de: "Datierte Entscheidungen" } },
9057
9548
  { key: "statusReports", hint: { en: "Dated RAG reports (scope/timeline/budget/skills)", de: "Datierte RAG-Berichte" } },
9549
+ {
9550
+ key: "milestones",
9551
+ hint: {
9552
+ en: "[{title, baselineDate, forecastDate?, doneDate?, note?}] \u2014 dated intermediate results (pilot live, vendor selected, go-live; at most 30, title up to 300 characters). baselineDate is the agreed plan; forecastDate today's expectation when it differs; doneDate once reached. Ask for the 3\u20135 that the steering committee watches. On an update, send every milestone the initiative keeps: the file replaces the list.",
9553
+ de: "[{title, baselineDate, forecastDate?, doneDate?, note?}] \u2014 datierte Zwischenergebnisse (Pilot live, Anbieter gew\xE4hlt, Go-live; h\xF6chstens 30, Titel bis 300 Zeichen). baselineDate ist der vereinbarte Plan, forecastDate die heutige Erwartung, wenn sie abweicht, doneDate sobald erreicht. Nach den 3\u20135 fragen, die der Lenkungsausschuss verfolgt. Bei einem Update alle Meilensteine senden, die bleiben sollen: die Datei ersetzt die Liste."
9554
+ }
9555
+ },
9556
+ {
9557
+ key: "capabilityImpacts",
9558
+ hint: {
9559
+ 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.",
9560
+ 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."
9561
+ }
9562
+ },
9058
9563
  {
9059
9564
  key: "requiredSkills",
9060
9565
  hint: {
@@ -9107,7 +9612,7 @@ function describeZodShape(schema, depth = 0) {
9107
9612
  }
9108
9613
  function buildSchemaDescriptor(sectionShapes) {
9109
9614
  return {
9110
- about: "BICon initiative composer. Collect the required fields, then rate every sub-dimension 0\u2013100 (higher = more of the named quality) and a confidence per dimension. Dimension scores are DERIVED (mean of subs) \u2014 never ask the user for them. Values are used verbatim; enum values must match exactly; unknown keys are rejected. Dates: talk dd/mm/yyyy with the user (dd/mm/yyyy, dd.mm.yyyy and yyyy-mm-dd are all accepted; stored as yyyy-mm-dd). Row ids of decision-log entries, status reports and incidents are minted by the Composer \u2014 never invent ids. To UPDATE an existing initiative pass its id as `id`; omit it for a new one.",
9615
+ about: "BICon initiative composer. Collect the required fields, then rate every sub-dimension 0\u2013100 (higher = more of the named quality) and a confidence per dimension. Dimension scores are DERIVED (mean of subs) \u2014 never ask the user for them. Values are used verbatim; enum values must match exactly; unknown keys are rejected. Dates: talk dd/mm/yyyy with the user (dd/mm/yyyy, dd.mm.yyyy and yyyy-mm-dd are all accepted; stored as yyyy-mm-dd). Row ids of decision-log entries, status reports, milestones and incidents are minted by the Composer \u2014 never invent ids. To UPDATE an existing initiative pass its id as `id`; omit it for a new one.",
9111
9616
  requiredFields: REQUIRED_FIELDS,
9112
9617
  enums: {
9113
9618
  status: STATUS_VALUES,
@@ -9139,7 +9644,7 @@ function buildSchemaDescriptor(sectionShapes) {
9139
9644
  },
9140
9645
  optionalSections: OPTIONAL_SECTIONS,
9141
9646
  // Exact shapes of the object/array sections (aiAct, economics, actuals,
9142
- // decisionLog, statusReports, requiredSkills). Keys ending in "?" are
9647
+ // decisionLog, statusReports, requiredSkills, capabilityImpacts, milestones). Keys ending in "?" are
9143
9648
  // optional; "enum[a|b]" lists the allowed values; "<key>" marks a map.
9144
9649
  // Pass these sections as JSON objects/arrays. Any key not listed is
9145
9650
  // rejected with its path.
@@ -9149,7 +9654,7 @@ function buildSchemaDescriptor(sectionShapes) {
9149
9654
  ...AI_ACT_VOCABULARIES,
9150
9655
  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."
9151
9656
  },
9152
- 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.",
9657
+ 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.",
9153
9658
  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."
9154
9659
  };
9155
9660
  }
@@ -9191,12 +9696,14 @@ var keepDescription = (from, to) => from.description ? to.describe(from.descript
9191
9696
  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)");
9192
9697
  var DATE_LIKE_KEY = /^date$|Date$|At$/;
9193
9698
  var MINTED_KEYS = /* @__PURE__ */ new Set(["id", "createdAt", "updatedAt"]);
9699
+ var SERVER_STAMP_KEY = /^(recorded|scored|checked)(At|By)$/;
9194
9700
  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;
9195
9701
  function deepStrict(schema) {
9196
9702
  const walk = (s, inArrayItem = false) => {
9197
9703
  if (s instanceof external_exports.ZodObject) {
9198
9704
  const next = {};
9199
9705
  for (const [k, v] of Object.entries(s.shape)) {
9706
+ if (SERVER_STAMP_KEY.test(k)) continue;
9200
9707
  let field = walk(v, false);
9201
9708
  if (inArrayItem && MINTED_KEYS.has(k) && !(field instanceof external_exports.ZodOptional)) field = field.optional();
9202
9709
  if (DATE_LIKE_KEY.test(k) && holdsString(field)) field = keepDescription(field, external_exports.preprocess(normaliseDateInput, field));
@@ -9233,7 +9740,7 @@ var parseIfString = (v) => typeof v === "string" ? tryParseJson(v) : v;
9233
9740
  function wireSection(inner, description) {
9234
9741
  return external_exports.preprocess(parseIfString, deepStrict(inner)).describe(description);
9235
9742
  }
9236
- var SECTION_KEYS = ["aiAct", "economics", "actuals", "decisionLog", "statusReports", "requiredSkills"];
9743
+ var SECTION_KEYS = ["aiAct", "economics", "actuals", "decisionLog", "statusReports", "requiredSkills", "capabilityImpacts", "milestones"];
9237
9744
  var SECTION_SCHEMAS = Object.fromEntries(
9238
9745
  SECTION_KEYS.map((k) => [k, contractSection(k)])
9239
9746
  );
@@ -9243,6 +9750,8 @@ var SECTION_DESCRIPTIONS = {
9243
9750
  actuals: "Actuals block (In Production only) \u2014 see sectionShapes.actuals.",
9244
9751
  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.",
9245
9752
  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.",
9753
+ 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.",
9754
+ milestones: "Milestones (max 30, title \u2264300 chars): baselineDate = the plan, forecastDate = today's expectation (omit = baseline), doneDate = reached. Dates dd/mm/yyyy or yyyy-mm-dd; ids minted. An update replaces the list: send all.",
9246
9755
  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."
9247
9756
  };
9248
9757
  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()]));
@@ -9286,6 +9795,8 @@ var compactSpecSchema = external_exports.object({
9286
9795
  decisionLog: wireSection(SECTION_SCHEMAS.decisionLog, SECTION_DESCRIPTIONS.decisionLog).optional(),
9287
9796
  statusReports: wireSection(SECTION_SCHEMAS.statusReports, SECTION_DESCRIPTIONS.statusReports).optional(),
9288
9797
  requiredSkills: wireSection(SECTION_SCHEMAS.requiredSkills, SECTION_DESCRIPTIONS.requiredSkills).optional(),
9798
+ capabilityImpacts: wireSection(SECTION_SCHEMAS.capabilityImpacts, SECTION_DESCRIPTIONS.capabilityImpacts).optional(),
9799
+ milestones: wireSection(SECTION_SCHEMAS.milestones, SECTION_DESCRIPTIONS.milestones).optional(),
9289
9800
  aiRiskTier: external_exports.enum(AI_RISK_TIERS).optional(),
9290
9801
  hitlPosture: external_exports.enum(HITL_POSTURES).optional(),
9291
9802
  dpiaStatus: external_exports.enum(DPIA_STATUSES).optional(),
@@ -9295,7 +9806,7 @@ var compactSpecSchema = external_exports.object({
9295
9806
  prohibitedOverride: external_exports.string().optional(),
9296
9807
  aiAct: wireSection(SECTION_SCHEMAS.aiAct, SECTION_DESCRIPTIONS.aiAct).optional(),
9297
9808
  context: contextWire().optional().describe(
9298
- `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.`
9809
+ `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.`
9299
9810
  )
9300
9811
  }).strict();
9301
9812
  var exportInputSchema = external_exports.object({
@@ -9340,7 +9851,7 @@ import { createHash } from "node:crypto";
9340
9851
 
9341
9852
  // ../../initiative-model/src/portfolio-context.ts
9342
9853
  var PORTFOLIO_CONTEXT_KIND = "portfolio-context";
9343
- var PORTFOLIO_CONTEXT_VERSION = 1;
9854
+ var PORTFOLIO_CONTEXT_VERSION = 2;
9344
9855
 
9345
9856
  // ../../initiative-model/src/ai-act-fields.ts
9346
9857
  var AI_ACT_FIELDS = [
@@ -9380,12 +9891,25 @@ var portfolioContextSchema = external_exports.object({
9380
9891
  suggestedTags: external_exports.array(external_exports.string()),
9381
9892
  skills: external_exports.array(external_exports.object({ id: external_exports.string().min(1), name: external_exports.string() }).passthrough()),
9382
9893
  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()),
9383
- sliders: external_exports.array(sliderSchema)
9894
+ sliders: external_exports.array(sliderSchema),
9895
+ /** Version 2 (2026-10-15): the capability map's leaves. Optional so a
9896
+ * version-1 file still parses — it then validates no capability links. */
9897
+ capabilities: external_exports.array(
9898
+ external_exports.object({
9899
+ id: external_exports.string().min(1),
9900
+ name: external_exports.string(),
9901
+ domain: external_exports.string(),
9902
+ importance: external_exports.enum(CAPABILITY_IMPORTANCES),
9903
+ currentMaturity: external_exports.number(),
9904
+ targetMaturity: external_exports.number()
9905
+ }).passthrough()
9906
+ ).optional()
9384
9907
  }).passthrough();
9385
9908
  var CONTEXT_SUPPORTED_VERSION = PORTFOLIO_CONTEXT_VERSION;
9386
9909
  function versionNotice(ctx) {
9387
9910
  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;
9388
9911
  }
9912
+ var CAPABILITY_MATURITY_RANGE = `${CAPABILITY_MATURITY_MIN}\u2013${CAPABILITY_MATURITY_MAX}`;
9389
9913
  var CONTEXT_ID_PREFIX = "ctx_";
9390
9914
  var CACHE_MAX = 32;
9391
9915
  var cache = /* @__PURE__ */ new Map();
@@ -9481,6 +10005,31 @@ function checkAgainstContext(spec, ctx) {
9481
10005
  for (const [i, s] of (spec.requiredSkills ?? []).entries()) {
9482
10006
  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.`);
9483
10007
  }
10008
+ const impacts = spec.capabilityImpacts ?? [];
10009
+ if (impacts.length && ctx.capabilities === void 0) {
10010
+ errors.push(
10011
+ "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."
10012
+ );
10013
+ } else {
10014
+ const caps = new Map((ctx.capabilities ?? []).map((c) => [c.id, c]));
10015
+ const seen = /* @__PURE__ */ new Set();
10016
+ for (const [i, link] of impacts.entries()) {
10017
+ if (seen.has(link.capabilityId)) continue;
10018
+ seen.add(link.capabilityId);
10019
+ const cap = caps.get(link.capabilityId);
10020
+ if (!cap) {
10021
+ errors.push(
10022
+ 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.`
10023
+ );
10024
+ continue;
10025
+ }
10026
+ if (link.maturityTo !== void 0 && link.kind !== "retire" && link.maturityTo < cap.currentMaturity) {
10027
+ warnings.push(
10028
+ `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}.`
10029
+ );
10030
+ }
10031
+ }
10032
+ }
9484
10033
  const aiFieldsSet = AI_ACT_FIELDS.filter((f) => spec[f] !== void 0);
9485
10034
  if (aiFieldsSet.length && !ctx.aiActEnabled) {
9486
10035
  warnings.push(
@@ -9523,6 +10072,7 @@ function buildInterviewPlan(ctx, contextId) {
9523
10072
  ...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.`] : [],
9524
10073
  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.",
9525
10074
  "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.",
10075
+ 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.",
9526
10076
  "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.",
9527
10077
  ...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.`] : [],
9528
10078
  "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.",
@@ -9547,7 +10097,17 @@ function buildInterviewPlan(ctx, contextId) {
9547
10097
  categories: ctx.categories,
9548
10098
  suggestedTags: ctx.suggestedTags,
9549
10099
  skills: ctx.skills.map((s) => ({ id: s.id, name: s.name })),
9550
- initiatives: ctx.initiatives.map((i) => ({ id: i.id, ...i.externalId ? { externalId: i.externalId } : {}, name: i.name, status: i.status }))
10100
+ initiatives: ctx.initiatives.map((i) => ({ id: i.id, ...i.externalId ? { externalId: i.externalId } : {}, name: i.name, status: i.status })),
10101
+ ...ctx.capabilities ? {
10102
+ capabilities: ctx.capabilities.map((c) => ({
10103
+ id: c.id,
10104
+ name: c.name,
10105
+ domain: c.domain,
10106
+ importance: c.importance,
10107
+ currentMaturity: c.currentMaturity,
10108
+ targetMaturity: c.targetMaturity
10109
+ }))
10110
+ } : {}
9551
10111
  },
9552
10112
  interview: {
9553
10113
  dimensions,
@@ -9608,8 +10168,11 @@ function checkAiActVocabularies(block, errors) {
9608
10168
  }
9609
10169
  function mintNestedIds(rows, stamp, withStamps = false) {
9610
10170
  if (!rows) return void 0;
10171
+ const seen = /* @__PURE__ */ new Set();
9611
10172
  return rows.map((r) => {
9612
- const next = { ...r, id: isUuid(r.id) ? r.id : randomUUID() };
10173
+ const id = isUuid(r.id) && !seen.has(r.id) ? r.id : randomUUID();
10174
+ seen.add(id);
10175
+ const next = { ...r, id };
9613
10176
  if (withStamps) {
9614
10177
  if (!next.createdAt) next.createdAt = stamp;
9615
10178
  if (!next.updatedAt) next.updatedAt = stamp;
@@ -9643,6 +10206,41 @@ function assembleInitiative(input, now = /* @__PURE__ */ new Date()) {
9643
10206
  }
9644
10207
  }
9645
10208
  if (spec.aiAct && typeof spec.aiAct === "object") checkAiActVocabularies(spec.aiAct, errors);
10209
+ const allImpacts = spec.capabilityImpacts ?? [];
10210
+ const seenCaps = /* @__PURE__ */ new Set();
10211
+ const impacts = [];
10212
+ for (const [i, link] of allImpacts.entries()) {
10213
+ if (seenCaps.has(link.capabilityId)) {
10214
+ errors.push(`capabilityImpacts.${i}.capabilityId: "${link.capabilityId}" is linked twice \u2014 one link per capability.`);
10215
+ continue;
10216
+ }
10217
+ seenCaps.add(link.capabilityId);
10218
+ impacts.push([i, link]);
10219
+ if (link.kind === "retire" && link.maturityTo !== void 0) errors.push(`capabilityImpacts.${i}.maturityTo: a retire link has no target level \u2014 omit maturityTo.`);
10220
+ 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}).`);
10221
+ }
10222
+ const milestones = spec.milestones ?? [];
10223
+ const pad = (n) => String(n).padStart(2, "0");
10224
+ const today = `${now.getFullYear()}-${pad(now.getMonth() + 1)}-${pad(now.getDate())}`;
10225
+ for (const [i, m] of milestones.entries()) {
10226
+ if (!m.title.trim()) errors.push(`milestones.${i}.title: must not be empty (got only spaces).`);
10227
+ for (const field of ["baselineDate", "forecastDate", "doneDate"]) {
10228
+ const v = m[field];
10229
+ if (v !== void 0 && !isCalendarDate(v)) errors.push(`milestones.${i}.${field}: "${v}" is not a real calendar date \u2014 dd/mm/yyyy or yyyy-mm-dd`);
10230
+ }
10231
+ const due = m.doneDate ?? m.forecastDate ?? m.baselineDate;
10232
+ if (isCalendarDate(due) && (spec.timelineStart && due < spec.timelineStart || spec.timelineEnd && due > spec.timelineEnd)) {
10233
+ warnings.push(`milestones.${i}: "${m.title.trim()}" falls on ${due}, outside the timeline ${spec.timelineStart} \u2013 ${spec.timelineEnd}.`);
10234
+ }
10235
+ if (m.doneDate && isCalendarDate(m.doneDate) && m.doneDate > today) warnings.push(`milestones.${i}.doneDate: ${m.doneDate} lies in the future \u2014 a done date marks a milestone already reached.`);
10236
+ }
10237
+ const norm2 = (v) => (v ?? "").trim().toLowerCase();
10238
+ const others = context?.initiatives ?? [];
10239
+ const ext = norm2(spec.externalId);
10240
+ const updates = spec.id !== void 0 || !!ext && others.filter((x) => norm2(x.externalId) === ext).length === 1 || others.some((x) => norm2(x.name) === norm2(spec.name));
10241
+ if (updates && spec.milestones === void 0) {
10242
+ warnings.push("milestones: none sent, and the app will offer this file as an update \u2014 it replaces the initiative's milestones, so any the app holds are removed. Send the full list to keep them.");
10243
+ }
9646
10244
  let businessUnit = spec.businessUnit;
9647
10245
  let aiCategory = spec.aiCategory;
9648
10246
  if (context) {
@@ -9656,6 +10254,9 @@ function assembleInitiative(input, now = /* @__PURE__ */ new Date()) {
9656
10254
  for (const [i, id] of (spec.dependsOn ?? []).entries()) {
9657
10255
  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.`);
9658
10256
  }
10257
+ for (const [i, link] of impacts) {
10258
+ 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.`);
10259
+ }
9659
10260
  }
9660
10261
  if (spec.timelineStart && spec.timelineEnd && spec.timelineEnd < spec.timelineStart) {
9661
10262
  warnings.push("timelineEnd is before timelineStart");
@@ -9690,6 +10291,7 @@ function assembleInitiative(input, now = /* @__PURE__ */ new Date()) {
9690
10291
  evaluation,
9691
10292
  decisionLog: mintNestedIds(spec.decisionLog, stamp),
9692
10293
  statusReports: mintNestedIds(spec.statusReports, stamp),
10294
+ milestones: mintNestedIds(spec.milestones, stamp)?.map((m) => ({ ...m, title: m.title.trim() })),
9693
10295
  aiAct: aiAct ? { ...aiAct, ...aiAct.incidents ? { incidents: mintNestedIds(aiAct.incidents, stamp, true) } : {} } : void 0,
9694
10296
  createdAt: stamp,
9695
10297
  updatedAt: stamp
@@ -9701,7 +10303,7 @@ function assembleInitiative(input, now = /* @__PURE__ */ new Date()) {
9701
10303
  }
9702
10304
 
9703
10305
  // ../../initiative-model/src/backup-version.ts
9704
- var BACKUP_VERSION = 10;
10306
+ var BACKUP_VERSION = 11;
9705
10307
 
9706
10308
  // src/envelope.ts
9707
10309
  var ENVELOPE_BRAND = "BICon Portfolio Steering";
@@ -9759,12 +10361,12 @@ function createServer() {
9759
10361
  async () => text({
9760
10362
  capabilities: [
9761
10363
  "strict typed schemas: unknown keys anywhere in the spec are rejected with their exact path (never silently dropped)",
9762
- "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",
10364
+ "sections (aiAct/economics/actuals/decisionLog/statusReports/requiredSkills/capabilityImpacts/milestones) accept a JSON object/array or the same JSON as a string; row ids are minted by the Composer",
9763
10365
  "dates accepted as dd/mm/yyyy, dd.mm.yyyy or yyyy-mm-dd (stored as yyyy-mm-dd)",
9764
10366
  "get_initiative_schema: sectionShapes, aiActVocabularies, portfolio-mode wording overlays",
9765
10367
  "AI-Act vocabulary and id-format enforcement with the allowed values in the error",
9766
10368
  "one pipeline: export_initiative_file takes the same spec as assemble_initiative \u2014 scores are always derived; pass `id` to update an existing initiative",
9767
- "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"
10369
+ "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)"
9768
10370
  ]
9769
10371
  })
9770
10372
  );
@@ -9780,7 +10382,7 @@ function createServer() {
9780
10382
  "read_portfolio_context",
9781
10383
  {
9782
10384
  title: "Read portfolio context",
9783
- 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) 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.",
10385
+ 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.",
9784
10386
  inputSchema: readContextInputSchema
9785
10387
  },
9786
10388
  async ({ context }) => {