@unified-product-graph/core 0.25.1 → 0.26.1

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.
package/dist/index.js CHANGED
@@ -909,7 +909,12 @@ var UPG_ENTITY_META = [
909
909
  // ── Program Management ──
910
910
  { name: "program", type_id: "ent_262", maturity: "stable", since: "0.1.0" },
911
911
  { name: "project", type_id: "ent_263", maturity: "stable", since: "0.1.0" },
912
- { name: "milestone", type_id: "ent_264", maturity: "stable", since: "0.1.0" },
912
+ // `portfolio_shared` (0.25.1 feedback): a milestone is often a cross-team gate,
913
+ // not one project's checkpoint — an org-wide "Open Beta" that several products'
914
+ // projects must all satisfy. Shared tier lets `project_targets_milestone` (and
915
+ // the other milestone edges) pass the cross-scope gate as `provisional`, same
916
+ // as `project_implements_initiative`. Precedent: `planning_cycle` (0.20.0).
917
+ { name: "milestone", type_id: "ent_264", maturity: "stable", since: "0.1.0", portfolio_shared: true },
913
918
  { name: "risk_register", type_id: "ent_265", maturity: "stable", since: "0.1.0" },
914
919
  { name: "risk_item", type_id: "ent_266", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "risk" },
915
920
  { name: "change_request", type_id: "ent_267", maturity: "stable", since: "0.1.0" },
@@ -4202,54 +4207,63 @@ var PRODUCT_LIFECYCLE = {
4202
4207
  phases: [
4203
4208
  {
4204
4209
  id: "concept",
4210
+ status_category: "triage",
4205
4211
  label: "Concept",
4206
4212
  description: "Napkin idea. Problem shape and solution sketch, pre-validation.",
4207
4213
  transitions_to: ["validation", "build", "beta", "launch", "growth", "mature", "sunset"]
4208
4214
  },
4209
4215
  {
4210
4216
  id: "validation",
4217
+ status_category: "started",
4211
4218
  label: "Validation",
4212
4219
  description: "Testing demand. User conversations and experiments pressure-test assumptions before build commits.",
4213
4220
  transitions_to: ["build", "beta", "launch", "growth", "mature", "sunset"]
4214
4221
  },
4215
4222
  {
4216
4223
  id: "build",
4224
+ status_category: "started",
4217
4225
  label: "Build",
4218
4226
  description: "Actively developing v1. Core functionality is being authored, pre-user.",
4219
4227
  transitions_to: ["beta", "launch", "growth", "mature", "sunset"]
4220
4228
  },
4221
4229
  {
4222
4230
  id: "beta",
4231
+ status_category: "started",
4223
4232
  label: "Beta",
4224
4233
  description: "Early users, iterating. Feature-complete enough to learn from, still changing weekly.",
4225
4234
  transitions_to: ["launch", "growth", "mature", "maintenance", "sunset"]
4226
4235
  },
4227
4236
  {
4228
4237
  id: "launch",
4238
+ status_category: "started",
4229
4239
  label: "Launch",
4230
4240
  description: "Generally available. Announced to the target audience, open past beta access.",
4231
4241
  transitions_to: ["growth", "mature", "maintenance", "sunset"]
4232
4242
  },
4233
4243
  {
4234
4244
  id: "growth",
4245
+ status_category: "started",
4235
4246
  label: "Growth",
4236
4247
  description: "Scaling users and revenue. Product fit validated; focus is acquisition, retention, expansion.",
4237
4248
  transitions_to: ["mature", "maintenance", "sunset"]
4238
4249
  },
4239
4250
  {
4240
4251
  id: "mature",
4252
+ status_category: "started",
4241
4253
  label: "Mature",
4242
4254
  description: "Stable. Growth levelled; investment weights toward optimisation, efficiency, and durability.",
4243
4255
  transitions_to: ["maintenance", "sunset"]
4244
4256
  },
4245
4257
  {
4246
4258
  id: "maintenance",
4259
+ status_category: "started",
4247
4260
  label: "Maintenance",
4248
4261
  description: "Sustaining. Minimal investment keeps the product running for existing users. Can transition back to `mature` on a strategic revival.",
4249
4262
  transitions_to: ["mature", "sunset"]
4250
4263
  },
4251
4264
  {
4252
4265
  id: "sunset",
4266
+ status_category: "completed",
4253
4267
  label: "Sunset",
4254
4268
  description: "Winding down or retired. Existing users are being migrated or offboarded.",
4255
4269
  transitions_to: []
@@ -4263,18 +4277,21 @@ var NEED_LIFECYCLE = {
4263
4277
  phases: [
4264
4278
  {
4265
4279
  id: "raw",
4280
+ status_category: "triage",
4266
4281
  label: "Raw",
4267
4282
  description: "Captured from an interview, observation, or support ticket. Articulation may be rough; may duplicate an existing need.",
4268
4283
  transitions_to: ["validated"]
4269
4284
  },
4270
4285
  {
4271
4286
  id: "validated",
4287
+ status_category: "started",
4272
4288
  label: "Validated",
4273
4289
  description: "Corroborated by multiple data points or targeted research. The team agrees it is a real, recurring need.",
4274
4290
  transitions_to: ["prioritized"]
4275
4291
  },
4276
4292
  {
4277
4293
  id: "prioritized",
4294
+ status_category: "completed",
4278
4295
  label: "Prioritized",
4279
4296
  description: "Ranked against other needs. Ready to inform opportunity definition and solution exploration.",
4280
4297
  transitions_to: []
@@ -4288,18 +4305,21 @@ var OPPORTUNITY_LIFECYCLE = {
4288
4305
  phases: [
4289
4306
  {
4290
4307
  id: "identified",
4308
+ status_category: "triage",
4291
4309
  label: "Identified",
4292
4310
  description: "A problem worth solving has been named. Sources include needs, insights, market trends, or competitive signals. Sizing and validation come next.",
4293
4311
  transitions_to: ["validated", "deferred"]
4294
4312
  },
4295
4313
  {
4296
4314
  id: "validated",
4315
+ status_category: "started",
4297
4316
  label: "Validated",
4298
4317
  description: "Research and evidence support pursuit. The problem is real, frequent, and painful enough to justify investment.",
4299
4318
  transitions_to: ["deferred"]
4300
4319
  },
4301
4320
  {
4302
4321
  id: "deferred",
4322
+ status_category: "backlog",
4303
4323
  label: "Deferred",
4304
4324
  description: "Acknowledged but parked. Capacity, priority, or strategic timing reasons. Can be reopened.",
4305
4325
  transitions_to: ["identified"]
@@ -4313,24 +4333,28 @@ var SOLUTION_LIFECYCLE = {
4313
4333
  phases: [
4314
4334
  {
4315
4335
  id: "proposed",
4336
+ status_category: "triage",
4316
4337
  label: "Proposed",
4317
4338
  description: "Identified as a possible response to an opportunity. Pre-commitment, pre-feasibility.",
4318
4339
  transitions_to: ["in_progress", "deferred"]
4319
4340
  },
4320
4341
  {
4321
4342
  id: "in_progress",
4343
+ status_category: "started",
4322
4344
  label: "In Progress",
4323
4345
  description: "A team is actively building, testing, or refining the solution.",
4324
4346
  transitions_to: ["shipped", "deferred"]
4325
4347
  },
4326
4348
  {
4327
4349
  id: "shipped",
4350
+ status_category: "completed",
4328
4351
  label: "Shipped",
4329
4352
  description: "Delivered to users. Live in the product.",
4330
4353
  transitions_to: ["deferred"]
4331
4354
  },
4332
4355
  {
4333
4356
  id: "deferred",
4357
+ status_category: "backlog",
4334
4358
  label: "Deferred",
4335
4359
  description: "Acknowledged but parked. Capacity, priority, or a change in direction. Can be reopened.",
4336
4360
  transitions_to: ["proposed"]
@@ -4344,24 +4368,28 @@ var EXPERIMENT_PLAN_LIFECYCLE = {
4344
4368
  phases: [
4345
4369
  {
4346
4370
  id: "drafted",
4371
+ status_category: "unstarted",
4347
4372
  label: "Drafted",
4348
4373
  description: "The plan is being written. Method, success criteria, target metric, projected reach/impact, ownership, and planned dates are being defined. Not yet approved.",
4349
4374
  transitions_to: ["scheduled", "cancelled"]
4350
4375
  },
4351
4376
  {
4352
4377
  id: "scheduled",
4378
+ status_category: "unstarted",
4353
4379
  label: "Scheduled",
4354
4380
  description: "The plan is approved and slotted for execution. Resources committed; awaiting start date.",
4355
4381
  transitions_to: ["approved", "cancelled"]
4356
4382
  },
4357
4383
  {
4358
4384
  id: "approved",
4385
+ status_category: "completed",
4359
4386
  label: "Approved",
4360
4387
  description: "Past scheduling: at least one run has started or completed against this plan. The plan is now a stable design artefact; future updates create a new plan.",
4361
4388
  transitions_to: []
4362
4389
  },
4363
4390
  {
4364
4391
  id: "cancelled",
4392
+ status_category: "cancelled",
4365
4393
  label: "Cancelled",
4366
4394
  description: "The plan was abandoned before any run started. Reason should be documented in description or via an attached decision.",
4367
4395
  transitions_to: []
@@ -4375,24 +4403,28 @@ var RESEARCH_PLAN_LIFECYCLE = {
4375
4403
  phases: [
4376
4404
  {
4377
4405
  id: "draft",
4406
+ status_category: "started",
4378
4407
  label: "Draft",
4379
4408
  description: "The plan is being written. Research question, suggested methods, and evidence threshold are being defined. Not yet approved for execution.",
4380
4409
  transitions_to: ["active"]
4381
4410
  },
4382
4411
  {
4383
4412
  id: "active",
4413
+ status_category: "started",
4384
4414
  label: "Active",
4385
4415
  description: "The plan has been approved and is being executed. Research sessions are underway or scheduled.",
4386
4416
  transitions_to: ["completed", "abandoned"]
4387
4417
  },
4388
4418
  {
4389
4419
  id: "completed",
4420
+ status_category: "completed",
4390
4421
  label: "Completed",
4391
4422
  description: "The planned research has been carried out and learnings have been captured. The plan is a historical record.",
4392
4423
  transitions_to: []
4393
4424
  },
4394
4425
  {
4395
4426
  id: "abandoned",
4427
+ status_category: "cancelled",
4396
4428
  label: "Abandoned",
4397
4429
  description: "Not executed: changing priorities, a decision no longer needing validation, or resource constraints.",
4398
4430
  transitions_to: []
@@ -4406,24 +4438,28 @@ var FEEDBACK_PROGRAM_LIFECYCLE = {
4406
4438
  phases: [
4407
4439
  {
4408
4440
  id: "planning",
4441
+ status_category: "unstarted",
4409
4442
  label: "Planning",
4410
4443
  description: "The program is being designed. Goals, audience, collection method, and cadence are being defined. No feedback is being collected yet.",
4411
4444
  transitions_to: ["active"]
4412
4445
  },
4413
4446
  {
4414
4447
  id: "active",
4448
+ status_category: "started",
4415
4449
  label: "Active",
4416
4450
  description: "The program is running. Feedback is being collected and processed on the defined cadence.",
4417
4451
  transitions_to: ["paused", "retired"]
4418
4452
  },
4419
4453
  {
4420
4454
  id: "paused",
4455
+ status_category: "backlog",
4421
4456
  label: "Paused",
4422
4457
  description: "Collection has been temporarily suspended. The program will resume.",
4423
4458
  transitions_to: ["active", "retired"]
4424
4459
  },
4425
4460
  {
4426
4461
  id: "retired",
4462
+ status_category: "completed",
4427
4463
  label: "Retired",
4428
4464
  description: "The program has ended. It is no longer collecting feedback. Historical data is preserved.",
4429
4465
  transitions_to: []
@@ -4437,36 +4473,42 @@ var FEATURE_REQUEST_LIFECYCLE = {
4437
4473
  phases: [
4438
4474
  {
4439
4475
  id: "new",
4476
+ status_category: "triage",
4440
4477
  label: "New",
4441
4478
  description: "The request has been submitted. It has not yet been reviewed by the product team.",
4442
4479
  transitions_to: ["under_review"]
4443
4480
  },
4444
4481
  {
4445
4482
  id: "under_review",
4483
+ status_category: "triage",
4446
4484
  label: "Under Review",
4447
4485
  description: "The request is being triaged. The product team is assessing feasibility, demand, and strategic fit.",
4448
4486
  transitions_to: ["planned", "wont_do"]
4449
4487
  },
4450
4488
  {
4451
4489
  id: "planned",
4490
+ status_category: "unstarted",
4452
4491
  label: "Planned",
4453
4492
  description: "The request has been accepted and is on the roadmap. It is scheduled for a future release cycle.",
4454
4493
  transitions_to: ["in_progress", "wont_do"]
4455
4494
  },
4456
4495
  {
4457
4496
  id: "in_progress",
4497
+ status_category: "started",
4458
4498
  label: "In Progress",
4459
4499
  description: "Work on fulfilling the request is actively underway.",
4460
4500
  transitions_to: ["shipped"]
4461
4501
  },
4462
4502
  {
4463
4503
  id: "shipped",
4504
+ status_category: "completed",
4464
4505
  label: "Shipped",
4465
4506
  description: "The requested capability has been delivered to users.",
4466
4507
  transitions_to: []
4467
4508
  },
4468
4509
  {
4469
4510
  id: "wont_do",
4511
+ status_category: "cancelled",
4470
4512
  label: "Won't Do",
4471
4513
  description: "Declined: strategic misalignment, infeasibility, or insufficient demand.",
4472
4514
  transitions_to: []
@@ -4480,24 +4522,28 @@ var BETA_PROGRAM_LIFECYCLE = {
4480
4522
  phases: [
4481
4523
  {
4482
4524
  id: "recruiting",
4525
+ status_category: "started",
4483
4526
  label: "Recruiting",
4484
4527
  description: "The program is accepting applications. Beta participants are being identified and onboarded.",
4485
4528
  transitions_to: ["active"]
4486
4529
  },
4487
4530
  {
4488
4531
  id: "active",
4532
+ status_category: "started",
4489
4533
  label: "Active",
4490
4534
  description: "Beta participants have access and are using the feature. Feedback is being collected.",
4491
4535
  transitions_to: ["graduated", "closed"]
4492
4536
  },
4493
4537
  {
4494
4538
  id: "graduated",
4539
+ status_category: "completed",
4495
4540
  label: "Graduated",
4496
4541
  description: "The beta was successful and the feature has progressed to general availability.",
4497
4542
  transitions_to: []
4498
4543
  },
4499
4544
  {
4500
4545
  id: "closed",
4546
+ status_category: "completed",
4501
4547
  label: "Closed",
4502
4548
  description: "The beta ended without graduating to GA. The feature was deprioritised, pivoted, or missed exit criteria.",
4503
4549
  transitions_to: []
@@ -4511,24 +4557,28 @@ var USER_ADVISORY_BOARD_LIFECYCLE = {
4511
4557
  phases: [
4512
4558
  {
4513
4559
  id: "recruiting",
4560
+ status_category: "started",
4514
4561
  label: "Recruiting",
4515
4562
  description: "Members are being identified and invited. The board is not yet convened.",
4516
4563
  transitions_to: ["active"]
4517
4564
  },
4518
4565
  {
4519
4566
  id: "active",
4567
+ status_category: "started",
4520
4568
  label: "Active",
4521
4569
  description: "The board is convened and meeting regularly. Members are providing strategic input.",
4522
4570
  transitions_to: ["paused", "retired"]
4523
4571
  },
4524
4572
  {
4525
4573
  id: "paused",
4574
+ status_category: "backlog",
4526
4575
  label: "Paused",
4527
4576
  description: "Board activities are temporarily suspended. Membership is retained and sessions will resume.",
4528
4577
  transitions_to: ["active", "retired"]
4529
4578
  },
4530
4579
  {
4531
4580
  id: "retired",
4581
+ status_category: "completed",
4532
4582
  label: "Retired",
4533
4583
  description: "The board has been disbanded. Members are no longer engaged in an advisory capacity.",
4534
4584
  transitions_to: []
@@ -4542,30 +4592,35 @@ var OBJECTIVE_LIFECYCLE = {
4542
4592
  phases: [
4543
4593
  {
4544
4594
  id: "draft",
4595
+ status_category: "started",
4545
4596
  label: "Draft",
4546
4597
  description: "The objective is being written. Key results have not yet been attached or approved.",
4547
4598
  transitions_to: ["active"]
4548
4599
  },
4549
4600
  {
4550
4601
  id: "active",
4602
+ status_category: "started",
4551
4603
  label: "Active",
4552
4604
  description: "The objective is in the current planning period. Key results are being measured and progress is tracked.",
4553
4605
  transitions_to: ["achieved", "missed", "deferred"]
4554
4606
  },
4555
4607
  {
4556
4608
  id: "achieved",
4609
+ status_category: "completed",
4557
4610
  label: "Achieved",
4558
4611
  description: "The objective was met or exceeded within the planning period.",
4559
4612
  transitions_to: []
4560
4613
  },
4561
4614
  {
4562
4615
  id: "missed",
4616
+ status_category: "completed",
4563
4617
  label: "Missed",
4564
4618
  description: "The planning period ended without achieving the objective. Learnings inform the next cycle.",
4565
4619
  transitions_to: []
4566
4620
  },
4567
4621
  {
4568
4622
  id: "deferred",
4623
+ status_category: "backlog",
4569
4624
  label: "Deferred",
4570
4625
  description: "The objective was not completed this period and is being carried forward. Can be reopened as active.",
4571
4626
  transitions_to: ["active"]
@@ -4579,24 +4634,28 @@ var KEY_RESULT_LIFECYCLE = {
4579
4634
  phases: [
4580
4635
  {
4581
4636
  id: "on_track",
4637
+ status_category: "started",
4582
4638
  label: "On Track",
4583
4639
  description: "Current measured value is progressing at a rate that should reach the target by the deadline.",
4584
4640
  transitions_to: ["at_risk", "behind", "achieved"]
4585
4641
  },
4586
4642
  {
4587
4643
  id: "at_risk",
4644
+ status_category: "started",
4588
4645
  label: "At Risk",
4589
4646
  description: "Progress is slowing. Without intervention, the target may not be reached by the deadline.",
4590
4647
  transitions_to: ["on_track", "behind", "achieved"]
4591
4648
  },
4592
4649
  {
4593
4650
  id: "behind",
4651
+ status_category: "started",
4594
4652
  label: "Behind",
4595
4653
  description: "Unlikely to reach the target at the current rate. The team needs to reassess strategy or accept a miss.",
4596
4654
  transitions_to: ["on_track", "at_risk", "achieved"]
4597
4655
  },
4598
4656
  {
4599
4657
  id: "achieved",
4658
+ status_category: "completed",
4600
4659
  label: "Achieved",
4601
4660
  description: "The target value has been reached or exceeded.",
4602
4661
  transitions_to: []
@@ -4610,18 +4669,21 @@ var STRATEGIC_THEME_LIFECYCLE = {
4610
4669
  phases: [
4611
4670
  {
4612
4671
  id: "active",
4672
+ status_category: "started",
4613
4673
  label: "Active",
4614
4674
  description: "The theme is a current organisational focus. Initiatives and objectives are being run under it.",
4615
4675
  transitions_to: ["completed", "paused"]
4616
4676
  },
4617
4677
  {
4618
4678
  id: "paused",
4679
+ status_category: "backlog",
4619
4680
  label: "Paused",
4620
4681
  description: "The theme is deprioritised for this period but is not being retired. It will resume.",
4621
4682
  transitions_to: ["active", "completed"]
4622
4683
  },
4623
4684
  {
4624
4685
  id: "completed",
4686
+ status_category: "completed",
4625
4687
  label: "Completed",
4626
4688
  description: "The theme has run its course. The focus area has been addressed or superseded by a new theme.",
4627
4689
  transitions_to: []
@@ -4635,24 +4697,28 @@ var INITIATIVE_LIFECYCLE = {
4635
4697
  phases: [
4636
4698
  {
4637
4699
  id: "proposed",
4700
+ status_category: "triage",
4638
4701
  label: "Proposed",
4639
4702
  description: "The initiative has been put forward but not yet approved for resourcing. Business case is being evaluated.",
4640
4703
  transitions_to: ["in_progress", "abandoned"]
4641
4704
  },
4642
4705
  {
4643
4706
  id: "in_progress",
4707
+ status_category: "started",
4644
4708
  label: "In Progress",
4645
4709
  description: "The initiative has been approved and work is underway. Teams are executing against it.",
4646
4710
  transitions_to: ["completed", "abandoned"]
4647
4711
  },
4648
4712
  {
4649
4713
  id: "completed",
4714
+ status_category: "completed",
4650
4715
  label: "Completed",
4651
4716
  description: "The initiative has achieved its goals and been formally closed.",
4652
4717
  transitions_to: []
4653
4718
  },
4654
4719
  {
4655
4720
  id: "abandoned",
4721
+ status_category: "cancelled",
4656
4722
  label: "Abandoned",
4657
4723
  description: "Stopped before completion: changing strategy, resource constraints, or learning that the goal is no longer relevant.",
4658
4724
  transitions_to: []
@@ -4666,18 +4732,21 @@ var STRATEGIC_PILLAR_LIFECYCLE = {
4666
4732
  phases: [
4667
4733
  {
4668
4734
  id: "proposed",
4735
+ status_category: "triage",
4669
4736
  label: "Proposed",
4670
4737
  description: "The pillar has been articulated but not yet ratified by leadership as a strategic commitment.",
4671
4738
  transitions_to: ["active"]
4672
4739
  },
4673
4740
  {
4674
4741
  id: "active",
4742
+ status_category: "started",
4675
4743
  label: "Active",
4676
4744
  description: "The pillar is a live strategic commitment. Decisions, themes, and initiatives are aligned to it.",
4677
4745
  transitions_to: ["sunset"]
4678
4746
  },
4679
4747
  {
4680
4748
  id: "sunset",
4749
+ status_category: "completed",
4681
4750
  label: "Sunset",
4682
4751
  description: "Retired: achieved, superseded by a new direction, or no longer reflects strategic reality.",
4683
4752
  transitions_to: []
@@ -4689,8 +4758,8 @@ var STRATEGIC_QUESTION_LIFECYCLE = {
4689
4758
  initial_phase: "open",
4690
4759
  terminal_phases: ["resolved"],
4691
4760
  phases: [
4692
- { id: "open", label: "Open", description: "The question has been raised but not yet answered. The plan is exposed to it.", transitions_to: ["resolved"] },
4693
- { id: "resolved", label: "Resolved", description: "The question has been answered; the resolution is captured. The plan is no longer exposed to it. May reopen if the answer unravels.", transitions_to: ["open"] }
4761
+ { id: "open", status_category: "triage", label: "Open", description: "The question has been raised but not yet answered. The plan is exposed to it.", transitions_to: ["resolved"] },
4762
+ { id: "resolved", status_category: "completed", label: "Resolved", description: "The question has been answered; the resolution is captured. The plan is no longer exposed to it. May reopen if the answer unravels.", transitions_to: ["open"] }
4694
4763
  ]
4695
4764
  };
4696
4765
  var OUTCOME_LIFECYCLE = {
@@ -4698,10 +4767,10 @@ var OUTCOME_LIFECYCLE = {
4698
4767
  initial_phase: "identified",
4699
4768
  terminal_phases: ["achieved", "abandoned"],
4700
4769
  phases: [
4701
- { id: "identified", label: "Identified", description: "The outcome has been named: the team agrees on what success looks like, but is not yet measuring it.", transitions_to: ["measuring", "abandoned"] },
4702
- { id: "measuring", label: "Measuring", description: "Instrumentation is live. Progress is being tracked against the outcome.", transitions_to: ["achieved", "abandoned"] },
4703
- { id: "achieved", label: "Achieved", description: "The outcome was reached. Captured for the record; no further pursuit required.", transitions_to: [] },
4704
- { id: "abandoned", label: "Abandoned", description: "Pursuit was stopped. Strategy shifted, the outcome lost relevance, or the cost outweighed value. May resume to `measuring` if the team revisits it.", transitions_to: ["measuring"] }
4770
+ { id: "identified", status_category: "triage", label: "Identified", description: "The outcome has been named: the team agrees on what success looks like, but is not yet measuring it.", transitions_to: ["measuring", "abandoned"] },
4771
+ { id: "measuring", status_category: "started", label: "Measuring", description: "Instrumentation is live. Progress is being tracked against the outcome.", transitions_to: ["achieved", "abandoned"] },
4772
+ { id: "achieved", status_category: "completed", label: "Achieved", description: "The outcome was reached. Captured for the record; no further pursuit required.", transitions_to: [] },
4773
+ { id: "abandoned", status_category: "cancelled", label: "Abandoned", description: "Pursuit was stopped. Strategy shifted, the outcome lost relevance, or the cost outweighed value. May resume to `measuring` if the team revisits it.", transitions_to: ["measuring"] }
4705
4774
  ]
4706
4775
  };
4707
4776
  var VISION_LIFECYCLE = {
@@ -4709,10 +4778,10 @@ var VISION_LIFECYCLE = {
4709
4778
  initial_phase: "drafting",
4710
4779
  terminal_phases: ["ratified", "revised", "archived"],
4711
4780
  phases: [
4712
- { id: "drafting", label: "Drafting", description: "Vision is being authored or rewritten. Not yet adopted.", transitions_to: ["ratified", "archived"] },
4713
- { id: "ratified", label: "Ratified", description: "The current, in-force vision. The team has aligned around it.", transitions_to: ["revised", "archived"] },
4714
- { id: "revised", label: "Revised", description: "Superseded by a newer vision but kept as a recorded milestone. May reopen to drafting if revisited.", transitions_to: ["drafting"] },
4715
- { id: "archived", label: "Archived", description: "No longer in force. Retained for historical reference.", transitions_to: ["drafting"] }
4781
+ { id: "drafting", status_category: "started", label: "Drafting", description: "Vision is being authored or rewritten. Not yet adopted.", transitions_to: ["ratified", "archived"] },
4782
+ { id: "ratified", status_category: "completed", label: "Ratified", description: "The current, in-force vision. The team has aligned around it.", transitions_to: ["revised", "archived"] },
4783
+ { id: "revised", status_category: "completed", label: "Revised", description: "Superseded by a newer vision but kept as a recorded milestone. May reopen to drafting if revisited.", transitions_to: ["drafting"] },
4784
+ { id: "archived", status_category: "completed", label: "Archived", description: "No longer in force. Retained for historical reference.", transitions_to: ["drafting"] }
4716
4785
  ]
4717
4786
  };
4718
4787
  var MISSION_LIFECYCLE = {
@@ -4720,9 +4789,9 @@ var MISSION_LIFECYCLE = {
4720
4789
  initial_phase: "drafting",
4721
4790
  terminal_phases: ["active", "archived"],
4722
4791
  phases: [
4723
- { id: "drafting", label: "Drafting", description: "Mission is being authored or rewritten. Not yet adopted.", transitions_to: ["active", "archived"] },
4724
- { id: "active", label: "Active", description: "The current, in-force mission. Guides product and organisational decisions.", transitions_to: ["archived"] },
4725
- { id: "archived", label: "Archived", description: "No longer in force. May reopen to drafting if the team revisits.", transitions_to: ["drafting"] }
4792
+ { id: "drafting", status_category: "started", label: "Drafting", description: "Mission is being authored or rewritten. Not yet adopted.", transitions_to: ["active", "archived"] },
4793
+ { id: "active", status_category: "started", label: "Active", description: "The current, in-force mission. Guides product and organisational decisions.", transitions_to: ["archived"] },
4794
+ { id: "archived", status_category: "completed", label: "Archived", description: "No longer in force. May reopen to drafting if the team revisits.", transitions_to: ["drafting"] }
4726
4795
  ]
4727
4796
  };
4728
4797
  var CAPABILITY_LIFECYCLE = {
@@ -4730,10 +4799,10 @@ var CAPABILITY_LIFECYCLE = {
4730
4799
  initial_phase: "planned",
4731
4800
  terminal_phases: ["operational", "retired"],
4732
4801
  phases: [
4733
- { id: "planned", label: "Planned", description: "Capability has been identified as needed but development has not started.", transitions_to: ["building", "retired"] },
4734
- { id: "building", label: "Building", description: "Active development: people, processes, or systems are being put in place.", transitions_to: ["operational", "retired"] },
4735
- { id: "operational", label: "Operational", description: "Capability is in place and functioning. The organisation can rely on it.", transitions_to: ["retired"] },
4736
- { id: "retired", label: "Retired", description: "No longer maintained. May reopen to building if the capability is reinvested in.", transitions_to: ["building"] }
4802
+ { id: "planned", status_category: "unstarted", label: "Planned", description: "Capability has been identified as needed but development has not started.", transitions_to: ["building", "retired"] },
4803
+ { id: "building", status_category: "started", label: "Building", description: "Active development: people, processes, or systems are being put in place.", transitions_to: ["operational", "retired"] },
4804
+ { id: "operational", status_category: "started", label: "Operational", description: "Capability is in place and functioning. The organisation can rely on it.", transitions_to: ["retired"] },
4805
+ { id: "retired", status_category: "completed", label: "Retired", description: "No longer maintained. May reopen to building if the capability is reinvested in.", transitions_to: ["building"] }
4737
4806
  ]
4738
4807
  };
4739
4808
  var FEATURE_AREA_LIFECYCLE = {
@@ -4743,18 +4812,21 @@ var FEATURE_AREA_LIFECYCLE = {
4743
4812
  phases: [
4744
4813
  {
4745
4814
  id: "planned",
4815
+ status_category: "unstarted",
4746
4816
  label: "Planned",
4747
4817
  description: "The feature area has been defined as an organising concept but no features have been built under it yet.",
4748
4818
  transitions_to: ["active"]
4749
4819
  },
4750
4820
  {
4751
4821
  id: "active",
4822
+ status_category: "started",
4752
4823
  label: "Active",
4753
4824
  description: "The feature area contains live features and is actively being developed.",
4754
4825
  transitions_to: ["deprecated"]
4755
4826
  },
4756
4827
  {
4757
4828
  id: "deprecated",
4829
+ status_category: "completed",
4758
4830
  label: "Deprecated",
4759
4831
  description: "The feature area is no longer being developed. It may still exist in the product but no new features are being added.",
4760
4832
  transitions_to: []
@@ -4768,24 +4840,28 @@ var FEATURE_LIFECYCLE = {
4768
4840
  phases: [
4769
4841
  {
4770
4842
  id: "proposed",
4843
+ status_category: "triage",
4771
4844
  label: "Proposed",
4772
4845
  description: "The feature has been suggested and is under consideration. It is not yet on the roadmap.",
4773
4846
  transitions_to: ["in_progress", "archived"]
4774
4847
  },
4775
4848
  {
4776
4849
  id: "in_progress",
4850
+ status_category: "started",
4777
4851
  label: "In Progress",
4778
4852
  description: "The feature is actively being designed and built.",
4779
4853
  transitions_to: ["shipped"]
4780
4854
  },
4781
4855
  {
4782
4856
  id: "shipped",
4857
+ status_category: "completed",
4783
4858
  label: "Shipped",
4784
4859
  description: "The feature is live in the product and available to users.",
4785
4860
  transitions_to: ["archived"]
4786
4861
  },
4787
4862
  {
4788
4863
  id: "archived",
4864
+ status_category: "completed",
4789
4865
  label: "Archived",
4790
4866
  description: "The feature has been removed from the product or superseded. It is retained as a historical record.",
4791
4867
  transitions_to: []
@@ -4799,18 +4875,21 @@ var RELEASE_LIFECYCLE = {
4799
4875
  phases: [
4800
4876
  {
4801
4877
  id: "planned",
4878
+ status_category: "unstarted",
4802
4879
  label: "Planned",
4803
4880
  description: "The release is defined and scheduled. Features are scoped but not all completed.",
4804
4881
  transitions_to: ["in_progress"]
4805
4882
  },
4806
4883
  {
4807
4884
  id: "in_progress",
4885
+ status_category: "started",
4808
4886
  label: "In Progress",
4809
4887
  description: "Features are being built. The release is open for development.",
4810
4888
  transitions_to: ["shipped"]
4811
4889
  },
4812
4890
  {
4813
4891
  id: "shipped",
4892
+ status_category: "completed",
4814
4893
  label: "Shipped",
4815
4894
  description: "The release has been deployed to production and is available to users.",
4816
4895
  transitions_to: []
@@ -4824,24 +4903,28 @@ var ROADMAP_ITEM_LIFECYCLE = {
4824
4903
  phases: [
4825
4904
  {
4826
4905
  id: "planned",
4906
+ status_category: "unstarted",
4827
4907
  label: "Planned",
4828
4908
  description: "The item is on the roadmap and scheduled for a future period.",
4829
4909
  transitions_to: ["in_progress", "deferred"]
4830
4910
  },
4831
4911
  {
4832
4912
  id: "in_progress",
4913
+ status_category: "started",
4833
4914
  label: "In Progress",
4834
4915
  description: "Work on this roadmap item is underway.",
4835
4916
  transitions_to: ["shipped", "deferred"]
4836
4917
  },
4837
4918
  {
4838
4919
  id: "shipped",
4920
+ status_category: "completed",
4839
4921
  label: "Shipped",
4840
4922
  description: "The roadmap item has been delivered.",
4841
4923
  transitions_to: []
4842
4924
  },
4843
4925
  {
4844
4926
  id: "deferred",
4927
+ status_category: "backlog",
4845
4928
  label: "Deferred",
4846
4929
  description: "The item has been pushed to a later period. It remains on the roadmap.",
4847
4930
  transitions_to: ["planned"]
@@ -4855,30 +4938,35 @@ var IP_ASSET_LIFECYCLE = {
4855
4938
  phases: [
4856
4939
  {
4857
4940
  id: "filed",
4941
+ status_category: "started",
4858
4942
  label: "Filed",
4859
4943
  description: "The IP application has been submitted to the relevant authority. Acknowledgement of filing is pending.",
4860
4944
  transitions_to: ["pending", "abandoned"]
4861
4945
  },
4862
4946
  {
4863
4947
  id: "pending",
4948
+ status_category: "started",
4864
4949
  label: "Pending",
4865
4950
  description: "The application has been acknowledged and is under examination by the relevant authority.",
4866
4951
  transitions_to: ["granted", "abandoned"]
4867
4952
  },
4868
4953
  {
4869
4954
  id: "granted",
4955
+ status_category: "completed",
4870
4956
  label: "Granted",
4871
4957
  description: "The IP right has been formally granted. Protection is in force.",
4872
4958
  transitions_to: ["expired", "abandoned"]
4873
4959
  },
4874
4960
  {
4875
4961
  id: "expired",
4962
+ status_category: "completed",
4876
4963
  label: "Expired",
4877
4964
  description: "The IP protection period has ended naturally.",
4878
4965
  transitions_to: []
4879
4966
  },
4880
4967
  {
4881
4968
  id: "abandoned",
4969
+ status_category: "cancelled",
4882
4970
  label: "Abandoned",
4883
4971
  description: "Abandoned: non-payment of renewal fees, withdrawal of the application, or a decision to stop defending it.",
4884
4972
  transitions_to: []
@@ -4892,36 +4980,42 @@ var CONTRACT_LIFECYCLE = {
4892
4980
  phases: [
4893
4981
  {
4894
4982
  id: "draft",
4983
+ status_category: "started",
4895
4984
  label: "Draft",
4896
4985
  description: "The contract is being written. Terms are not yet agreed by all parties.",
4897
4986
  transitions_to: ["in_review"]
4898
4987
  },
4899
4988
  {
4900
4989
  id: "in_review",
4990
+ status_category: "started",
4901
4991
  label: "In Review",
4902
4992
  description: "The draft is under review by legal counsel or the counterparty. Negotiations may be ongoing.",
4903
4993
  transitions_to: ["signed", "draft"]
4904
4994
  },
4905
4995
  {
4906
4996
  id: "signed",
4997
+ status_category: "completed",
4907
4998
  label: "Signed",
4908
4999
  description: "All parties have signed. The contract is executed and legally binding, but the effective period may not have started yet.",
4909
5000
  transitions_to: ["active"]
4910
5001
  },
4911
5002
  {
4912
5003
  id: "active",
5004
+ status_category: "started",
4913
5005
  label: "Active",
4914
5006
  description: "The contract is in its effective period. Obligations are in force.",
4915
5007
  transitions_to: ["expired", "terminated"]
4916
5008
  },
4917
5009
  {
4918
5010
  id: "expired",
5011
+ status_category: "completed",
4919
5012
  label: "Expired",
4920
5013
  description: "The contract has reached its end date naturally.",
4921
5014
  transitions_to: []
4922
5015
  },
4923
5016
  {
4924
5017
  id: "terminated",
5018
+ status_category: "cancelled",
4925
5019
  label: "Terminated",
4926
5020
  description: "Ended before natural expiry: mutual agreement, breach, or exercise of a termination clause.",
4927
5021
  transitions_to: []
@@ -4935,24 +5029,28 @@ var DESIGN_CONCEPT_LIFECYCLE = {
4935
5029
  phases: [
4936
5030
  {
4937
5031
  id: "sketched",
5032
+ status_category: "started",
4938
5033
  label: "Sketched",
4939
5034
  description: "The concept has been captured in early, rough form. It is an idea worth exploring but has not been refined or evaluated.",
4940
5035
  transitions_to: ["refined", "selected", "rejected"]
4941
5036
  },
4942
5037
  {
4943
5038
  id: "refined",
5039
+ status_category: "started",
4944
5040
  label: "Refined",
4945
5041
  description: "The concept has been developed with more detail. It is being compared to other concepts in the selection process.",
4946
5042
  transitions_to: ["selected", "rejected"]
4947
5043
  },
4948
5044
  {
4949
5045
  id: "selected",
5046
+ status_category: "completed",
4950
5047
  label: "Selected",
4951
5048
  description: "This concept has been chosen to move forward into prototyping or implementation.",
4952
5049
  transitions_to: []
4953
5050
  },
4954
5051
  {
4955
5052
  id: "rejected",
5053
+ status_category: "cancelled",
4956
5054
  label: "Rejected",
4957
5055
  description: "This concept was evaluated and not selected. It is retained as a record of design exploration.",
4958
5056
  transitions_to: []
@@ -4966,18 +5064,21 @@ var BRAND_IDENTITY_LIFECYCLE = {
4966
5064
  phases: [
4967
5065
  {
4968
5066
  id: "exploratory",
5067
+ status_category: "started",
4969
5068
  label: "Exploratory",
4970
5069
  description: "The brand is in early formation. Names, values, visual directions, and positioning are being explored without commitment.",
4971
5070
  transitions_to: ["defined"]
4972
5071
  },
4973
5072
  {
4974
5073
  id: "defined",
5074
+ status_category: "started",
4975
5075
  label: "Defined",
4976
5076
  description: "Core brand elements have been decided. Name, values, visual identity, and voice are articulated. The brand is being applied but may still be evolving.",
4977
5077
  transitions_to: ["mature"]
4978
5078
  },
4979
5079
  {
4980
5080
  id: "mature",
5081
+ status_category: "completed",
4981
5082
  label: "Mature",
4982
5083
  description: "The brand identity is fully articulated and consistently applied. Guidelines are documented and followed across all touchpoints.",
4983
5084
  transitions_to: []
@@ -4991,30 +5092,35 @@ var SCREEN_LIFECYCLE = {
4991
5092
  phases: [
4992
5093
  {
4993
5094
  id: "draft",
5095
+ status_category: "started",
4994
5096
  label: "Draft",
4995
5097
  description: "The screen is a rough idea: named and scoped, but not yet worked in a design tool.",
4996
5098
  transitions_to: ["in_design"]
4997
5099
  },
4998
5100
  {
4999
5101
  id: "in_design",
5102
+ status_category: "started",
5000
5103
  label: "In Design",
5001
5104
  description: "The screen is being designed: wireframes, mockups, or prototypes are in progress. May fall back to `draft` if the approach is rethought from scratch.",
5002
5105
  transitions_to: ["built", "draft"]
5003
5106
  },
5004
5107
  {
5005
5108
  id: "built",
5109
+ status_category: "started",
5006
5110
  label: "Built",
5007
5111
  description: "The screen has been implemented in code. It exists in a build but is not yet live for users. May return to `in_design` if implementation surfaces a design gap.",
5008
5112
  transitions_to: ["shipped", "in_design"]
5009
5113
  },
5010
5114
  {
5011
5115
  id: "shipped",
5116
+ status_category: "completed",
5012
5117
  label: "Shipped",
5013
5118
  description: "The screen is live in production and reachable by users.",
5014
5119
  transitions_to: ["deprecated"]
5015
5120
  },
5016
5121
  {
5017
5122
  id: "deprecated",
5123
+ status_category: "completed",
5018
5124
  label: "Deprecated",
5019
5125
  description: "The screen has been retired. It is no longer reachable, or is being phased out in favour of a replacement.",
5020
5126
  transitions_to: []
@@ -5028,24 +5134,28 @@ var SERVICE_LIFECYCLE = {
5028
5134
  phases: [
5029
5135
  {
5030
5136
  id: "development",
5137
+ status_category: "started",
5031
5138
  label: "Development",
5032
5139
  description: "The service is being built. It is not available in any shared environment.",
5033
5140
  transitions_to: ["staging"]
5034
5141
  },
5035
5142
  {
5036
5143
  id: "staging",
5144
+ status_category: "started",
5037
5145
  label: "Staging",
5038
5146
  description: "The service is deployed to a staging environment for integration testing and pre-release validation.",
5039
5147
  transitions_to: ["production", "development"]
5040
5148
  },
5041
5149
  {
5042
5150
  id: "production",
5151
+ status_category: "started",
5043
5152
  label: "Production",
5044
5153
  description: "The service is live and serving real users.",
5045
5154
  transitions_to: ["deprecated"]
5046
5155
  },
5047
5156
  {
5048
5157
  id: "deprecated",
5158
+ status_category: "completed",
5049
5159
  label: "Deprecated",
5050
5160
  description: "The service is being phased out. A successor service is in place or the capability is no longer needed.",
5051
5161
  transitions_to: []
@@ -5059,18 +5169,21 @@ var DEPLOYMENT_LIFECYCLE = {
5059
5169
  phases: [
5060
5170
  {
5061
5171
  id: "rolling",
5172
+ status_category: "started",
5062
5173
  label: "Rolling",
5063
5174
  description: "The deployment is in progress. Instances are being updated. Not all traffic has shifted yet.",
5064
5175
  transitions_to: ["success", "failure"]
5065
5176
  },
5066
5177
  {
5067
5178
  id: "success",
5179
+ status_category: "completed",
5068
5180
  label: "Success",
5069
5181
  description: "The deployment completed successfully. All instances are running the new version.",
5070
5182
  transitions_to: []
5071
5183
  },
5072
5184
  {
5073
5185
  id: "failure",
5186
+ status_category: "completed",
5074
5187
  label: "Failure",
5075
5188
  description: "The deployment failed or was rolled back. The previous version is restored.",
5076
5189
  transitions_to: []
@@ -5084,18 +5197,21 @@ var FEATURE_FLAG_LIFECYCLE = {
5084
5197
  phases: [
5085
5198
  {
5086
5199
  id: "off",
5200
+ status_category: "backlog",
5087
5201
  label: "Off",
5088
5202
  description: "The flag is disabled. The associated feature or code path is not active for any users.",
5089
5203
  transitions_to: ["rollout", "on"]
5090
5204
  },
5091
5205
  {
5092
5206
  id: "rollout",
5207
+ status_category: "started",
5093
5208
  label: "Rollout",
5094
5209
  description: "The flag is partially enabled. A percentage of users or a target segment has access.",
5095
5210
  transitions_to: ["on", "off"]
5096
5211
  },
5097
5212
  {
5098
5213
  id: "on",
5214
+ status_category: "completed",
5099
5215
  label: "On",
5100
5216
  description: "The flag is fully enabled for all users. The feature is live. The flag can be cleaned up.",
5101
5217
  transitions_to: []
@@ -5109,30 +5225,35 @@ var INVESTIGATION_LIFECYCLE = {
5109
5225
  phases: [
5110
5226
  {
5111
5227
  id: "open",
5228
+ status_category: "triage",
5112
5229
  label: "Open",
5113
5230
  description: "The investigation has been opened. A problem has been identified but not yet actively worked.",
5114
5231
  transitions_to: ["active"]
5115
5232
  },
5116
5233
  {
5117
5234
  id: "active",
5235
+ status_category: "started",
5118
5236
  label: "Active",
5119
5237
  description: "The investigation is being actively worked. Evidence is being gathered and hypotheses are being tested.",
5120
5238
  transitions_to: ["paused", "resolved", "abandoned"]
5121
5239
  },
5122
5240
  {
5123
5241
  id: "paused",
5242
+ status_category: "backlog",
5124
5243
  label: "Paused",
5125
5244
  description: "On hold: awaiting additional data, unblocking conditions, or reprioritisation.",
5126
5245
  transitions_to: ["active", "abandoned"]
5127
5246
  },
5128
5247
  {
5129
5248
  id: "resolved",
5249
+ status_category: "completed",
5130
5250
  label: "Resolved",
5131
5251
  description: "Root cause has been identified and documented. The investigation is closed.",
5132
5252
  transitions_to: []
5133
5253
  },
5134
5254
  {
5135
5255
  id: "abandoned",
5256
+ status_category: "cancelled",
5136
5257
  label: "Abandoned",
5137
5258
  description: "Closed without resolution: the problem could not be reproduced, was deemed not worth pursuing, or became moot.",
5138
5259
  transitions_to: []
@@ -5146,24 +5267,28 @@ var EXTERNAL_API_LIFECYCLE = {
5146
5267
  phases: [
5147
5268
  {
5148
5269
  id: "beta",
5270
+ status_category: "started",
5149
5271
  label: "Beta",
5150
5272
  description: "The API is available for early access or testing. It may be unstable and subject to breaking changes.",
5151
5273
  transitions_to: ["active"]
5152
5274
  },
5153
5275
  {
5154
5276
  id: "active",
5277
+ status_category: "started",
5155
5278
  label: "Active",
5156
5279
  description: "The API is stable and in production use. The provider guarantees availability per their SLA.",
5157
5280
  transitions_to: ["deprecated", "unavailable"]
5158
5281
  },
5159
5282
  {
5160
5283
  id: "deprecated",
5284
+ status_category: "started",
5161
5285
  label: "Deprecated",
5162
5286
  description: "The provider has announced end-of-life. The API still works but a migration to a successor is required.",
5163
5287
  transitions_to: ["unavailable"]
5164
5288
  },
5165
5289
  {
5166
5290
  id: "unavailable",
5291
+ status_category: "completed",
5167
5292
  label: "Unavailable",
5168
5293
  description: "The API is no longer accessible. Any dependent service is broken until migrated.",
5169
5294
  transitions_to: []
@@ -5177,18 +5302,21 @@ var DATABASE_SCHEMA_LIFECYCLE = {
5177
5302
  phases: [
5178
5303
  {
5179
5304
  id: "current",
5305
+ status_category: "started",
5180
5306
  label: "Current",
5181
5307
  description: "The schema is up to date with the applied migrations. No pending changes.",
5182
5308
  transitions_to: ["pending"]
5183
5309
  },
5184
5310
  {
5185
5311
  id: "pending",
5312
+ status_category: "unstarted",
5186
5313
  label: "Pending",
5187
5314
  description: "A migration is queued and ready to run. The schema will change when it is applied.",
5188
5315
  transitions_to: ["current", "failed"]
5189
5316
  },
5190
5317
  {
5191
5318
  id: "failed",
5319
+ status_category: "completed",
5192
5320
  label: "Failed",
5193
5321
  description: "A migration failed during application. The schema is in an inconsistent state and requires remediation before further changes can be applied.",
5194
5322
  transitions_to: ["pending"]
@@ -5202,30 +5330,35 @@ var INCIDENT_LIFECYCLE = {
5202
5330
  phases: [
5203
5331
  {
5204
5332
  id: "detected",
5333
+ status_category: "triage",
5205
5334
  label: "Detected",
5206
5335
  description: "Identified by an alert, a user report, or direct observation. Response has not yet started.",
5207
5336
  transitions_to: ["triaged"]
5208
5337
  },
5209
5338
  {
5210
5339
  id: "triaged",
5340
+ status_category: "triage",
5211
5341
  label: "Triaged",
5212
5342
  description: "The incident has been assessed for severity and impact. An on-call responder is assigned and is actively working it.",
5213
5343
  transitions_to: ["contained"]
5214
5344
  },
5215
5345
  {
5216
5346
  id: "contained",
5347
+ status_category: "started",
5217
5348
  label: "Contained",
5218
5349
  description: "Immediate user impact stopped via rollback, circuit breaker, or another emergency measure. Root cause fix is still pending.",
5219
5350
  transitions_to: ["resolved", "mitigated"]
5220
5351
  },
5221
5352
  {
5222
5353
  id: "resolved",
5354
+ status_category: "completed",
5223
5355
  label: "Resolved",
5224
5356
  description: "Root cause has been identified and fixed. The system is back to normal. A postmortem is recommended.",
5225
5357
  transitions_to: []
5226
5358
  },
5227
5359
  {
5228
5360
  id: "mitigated",
5361
+ status_category: "completed",
5229
5362
  label: "Mitigated",
5230
5363
  description: "A compensating control is in place and user impact is stopped, but the root cause remains unfixed. A follow-up investigation or fix is required.",
5231
5364
  transitions_to: []
@@ -5239,24 +5372,28 @@ var SECURITY_CONTROL_LIFECYCLE = {
5239
5372
  phases: [
5240
5373
  {
5241
5374
  id: "planned",
5375
+ status_category: "unstarted",
5242
5376
  label: "Planned",
5243
5377
  description: "The control has been identified as required but implementation has not started.",
5244
5378
  transitions_to: ["in_progress"]
5245
5379
  },
5246
5380
  {
5247
5381
  id: "in_progress",
5382
+ status_category: "started",
5248
5383
  label: "In Progress",
5249
5384
  description: "The control is being implemented.",
5250
5385
  transitions_to: ["implemented"]
5251
5386
  },
5252
5387
  {
5253
5388
  id: "implemented",
5389
+ status_category: "started",
5254
5390
  label: "Implemented",
5255
5391
  description: "The control is in place. It has not yet been independently tested or verified.",
5256
5392
  transitions_to: ["verified", "in_progress"]
5257
5393
  },
5258
5394
  {
5259
5395
  id: "verified",
5396
+ status_category: "completed",
5260
5397
  label: "Verified",
5261
5398
  description: "The control has been tested and confirmed effective. It provides the intended security assurance.",
5262
5399
  transitions_to: []
@@ -5270,30 +5407,35 @@ var DATA_PIPELINE_LIFECYCLE = {
5270
5407
  phases: [
5271
5408
  {
5272
5409
  id: "building",
5410
+ status_category: "started",
5273
5411
  label: "Building",
5274
5412
  description: "The pipeline is under construction. It is not yet processing real data.",
5275
5413
  transitions_to: ["active"]
5276
5414
  },
5277
5415
  {
5278
5416
  id: "active",
5417
+ status_category: "started",
5279
5418
  label: "Active",
5280
5419
  description: "The pipeline is running and processing data on its defined schedule.",
5281
5420
  transitions_to: ["paused", "failed", "deprecated"]
5282
5421
  },
5283
5422
  {
5284
5423
  id: "paused",
5424
+ status_category: "backlog",
5285
5425
  label: "Paused",
5286
5426
  description: "Deliberately suspended: maintenance, cost control, or upstream data unavailability.",
5287
5427
  transitions_to: ["active", "deprecated"]
5288
5428
  },
5289
5429
  {
5290
5430
  id: "failed",
5431
+ status_category: "started",
5291
5432
  label: "Failed",
5292
5433
  description: "The pipeline has errored and is not processing data. Intervention is required to restore it.",
5293
5434
  transitions_to: ["active"]
5294
5435
  },
5295
5436
  {
5296
5437
  id: "deprecated",
5438
+ status_category: "completed",
5297
5439
  label: "Deprecated",
5298
5440
  description: "The pipeline is being retired. It is no longer maintained and will be shut down.",
5299
5441
  transitions_to: []
@@ -5307,30 +5449,35 @@ var AI_MODEL_LIFECYCLE = {
5307
5449
  phases: [
5308
5450
  {
5309
5451
  id: "evaluating",
5452
+ status_category: "started",
5310
5453
  label: "Evaluating",
5311
5454
  description: "The model is being assessed for quality, cost, safety, and fit. Eval runs are being analysed. No production traffic.",
5312
5455
  transitions_to: ["staging", "retired"]
5313
5456
  },
5314
5457
  {
5315
5458
  id: "staging",
5459
+ status_category: "started",
5316
5460
  label: "Staging",
5317
5461
  description: "The model has passed evaluation and is deployed to a staging environment for integration testing.",
5318
5462
  transitions_to: ["production", "evaluating", "retired"]
5319
5463
  },
5320
5464
  {
5321
5465
  id: "production",
5466
+ status_category: "started",
5322
5467
  label: "Production",
5323
5468
  description: "The model is serving live product traffic.",
5324
5469
  transitions_to: ["deprecated", "retired"]
5325
5470
  },
5326
5471
  {
5327
5472
  id: "deprecated",
5473
+ status_category: "started",
5328
5474
  label: "Deprecated",
5329
5475
  description: "A successor model is in production. This model is being phased out. Traffic is being migrated.",
5330
5476
  transitions_to: ["retired"]
5331
5477
  },
5332
5478
  {
5333
5479
  id: "retired",
5480
+ status_category: "completed",
5334
5481
  label: "Retired",
5335
5482
  description: "The model is fully decommissioned. No traffic. Historical records are preserved.",
5336
5483
  transitions_to: []
@@ -5344,36 +5491,42 @@ var WORKFLOW_RUN_LIFECYCLE = {
5344
5491
  phases: [
5345
5492
  {
5346
5493
  id: "pending",
5494
+ status_category: "unstarted",
5347
5495
  label: "Pending",
5348
5496
  description: "The run has been queued and is awaiting execution. Resources or dependencies are being provisioned.",
5349
5497
  transitions_to: ["running", "cancelled"]
5350
5498
  },
5351
5499
  {
5352
5500
  id: "running",
5501
+ status_category: "started",
5353
5502
  label: "Running",
5354
5503
  description: "The workflow is actively executing its steps.",
5355
5504
  transitions_to: ["blocked", "completed", "failed", "cancelled"]
5356
5505
  },
5357
5506
  {
5358
5507
  id: "blocked",
5508
+ status_category: "started",
5359
5509
  label: "Blocked",
5360
5510
  description: "Execution is paused at a review_gate awaiting human or automated approval before proceeding.",
5361
5511
  transitions_to: ["running", "cancelled"]
5362
5512
  },
5363
5513
  {
5364
5514
  id: "completed",
5515
+ status_category: "completed",
5365
5516
  label: "Completed",
5366
5517
  description: "All steps executed successfully. Outputs are available.",
5367
5518
  transitions_to: []
5368
5519
  },
5369
5520
  {
5370
5521
  id: "failed",
5522
+ status_category: "completed",
5371
5523
  label: "Failed",
5372
5524
  description: "The run encountered an unrecoverable error and stopped. Partial outputs may be available.",
5373
5525
  transitions_to: []
5374
5526
  },
5375
5527
  {
5376
5528
  id: "cancelled",
5529
+ status_category: "cancelled",
5377
5530
  label: "Cancelled",
5378
5531
  description: "The run was deliberately stopped before completion.",
5379
5532
  transitions_to: []
@@ -5387,30 +5540,35 @@ var AGENT_DEFINITION_LIFECYCLE = {
5387
5540
  phases: [
5388
5541
  {
5389
5542
  id: "testing",
5543
+ status_category: "started",
5390
5544
  label: "Testing",
5391
5545
  description: "The agent is being validated in a controlled environment. Sessions are not running against real product data.",
5392
5546
  transitions_to: ["active", "disabled"]
5393
5547
  },
5394
5548
  {
5395
5549
  id: "active",
5550
+ status_category: "started",
5396
5551
  label: "Active",
5397
5552
  description: "The agent is operational and creating sessions on demand.",
5398
5553
  transitions_to: ["paused", "disabled", "retired"]
5399
5554
  },
5400
5555
  {
5401
5556
  id: "paused",
5557
+ status_category: "backlog",
5402
5558
  label: "Paused",
5403
5559
  description: "The agent is temporarily suspended. It is not creating new sessions but its configuration is preserved.",
5404
5560
  transitions_to: ["active", "retired"]
5405
5561
  },
5406
5562
  {
5407
5563
  id: "disabled",
5564
+ status_category: "backlog",
5408
5565
  label: "Disabled",
5409
5566
  description: "Turned off: bug, policy change, or safety concern. Can be re-enabled after remediation.",
5410
5567
  transitions_to: ["testing", "active", "retired"]
5411
5568
  },
5412
5569
  {
5413
5570
  id: "retired",
5571
+ status_category: "completed",
5414
5572
  label: "Retired",
5415
5573
  description: "The agent has been permanently decommissioned. Sessions are no longer created from this definition.",
5416
5574
  transitions_to: []
@@ -5424,24 +5582,28 @@ var AGENT_SESSION_LIFECYCLE = {
5424
5582
  phases: [
5425
5583
  {
5426
5584
  id: "active",
5585
+ status_category: "started",
5427
5586
  label: "Active",
5428
5587
  description: "The session is running. The agent is processing input and producing output.",
5429
5588
  transitions_to: ["completed", "crashed", "timed_out"]
5430
5589
  },
5431
5590
  {
5432
5591
  id: "completed",
5592
+ status_category: "completed",
5433
5593
  label: "Completed",
5434
5594
  description: "The session ended normally. The task was completed or the conversation was concluded.",
5435
5595
  transitions_to: []
5436
5596
  },
5437
5597
  {
5438
5598
  id: "crashed",
5599
+ status_category: "completed",
5439
5600
  label: "Crashed",
5440
5601
  description: "The session terminated unexpectedly due to an unhandled error or infrastructure failure.",
5441
5602
  transitions_to: []
5442
5603
  },
5443
5604
  {
5444
5605
  id: "timed_out",
5606
+ status_category: "completed",
5445
5607
  label: "Timed Out",
5446
5608
  description: "The session exceeded its maximum allowed duration and was automatically terminated.",
5447
5609
  transitions_to: []
@@ -5455,24 +5617,28 @@ var REVIEW_GATE_LIFECYCLE = {
5455
5617
  phases: [
5456
5618
  {
5457
5619
  id: "pending",
5620
+ status_category: "unstarted",
5458
5621
  label: "Pending",
5459
5622
  description: "The gate is awaiting review. The workflow is blocked until a decision is made.",
5460
5623
  transitions_to: ["approved", "rejected", "bypassed"]
5461
5624
  },
5462
5625
  {
5463
5626
  id: "approved",
5627
+ status_category: "completed",
5464
5628
  label: "Approved",
5465
5629
  description: "The gate has been passed. The workflow continues.",
5466
5630
  transitions_to: []
5467
5631
  },
5468
5632
  {
5469
5633
  id: "rejected",
5634
+ status_category: "cancelled",
5470
5635
  label: "Rejected",
5471
5636
  description: "The gate was not passed. The workflow is blocked and the submitter must address the feedback before re-submitting.",
5472
5637
  transitions_to: ["pending"]
5473
5638
  },
5474
5639
  {
5475
5640
  id: "bypassed",
5641
+ status_category: "cancelled",
5476
5642
  label: "Bypassed",
5477
5643
  description: "Deliberately overridden without normal review by an authorised person in an emergency. Create an audit trail entry.",
5478
5644
  transitions_to: []
@@ -5486,18 +5652,21 @@ var TEST_SUITE_LIFECYCLE = {
5486
5652
  phases: [
5487
5653
  {
5488
5654
  id: "draft",
5655
+ status_category: "started",
5489
5656
  label: "Draft",
5490
5657
  description: "The test suite is being authored. It is not yet part of any CI or QA process.",
5491
5658
  transitions_to: ["active"]
5492
5659
  },
5493
5660
  {
5494
5661
  id: "active",
5662
+ status_category: "started",
5495
5663
  label: "Active",
5496
5664
  description: "The suite is running in CI or scheduled QA processes.",
5497
5665
  transitions_to: ["deprecated"]
5498
5666
  },
5499
5667
  {
5500
5668
  id: "deprecated",
5669
+ status_category: "completed",
5501
5670
  label: "Deprecated",
5502
5671
  description: "The suite is no longer being run. It may be superseded by a newer suite or the tested functionality may have been removed.",
5503
5672
  transitions_to: []
@@ -5511,18 +5680,21 @@ var TEST_CASE_LIFECYCLE = {
5511
5680
  phases: [
5512
5681
  {
5513
5682
  id: "draft",
5683
+ status_category: "started",
5514
5684
  label: "Draft",
5515
5685
  description: "The test case is being written. Preconditions, steps, and expected results are being defined.",
5516
5686
  transitions_to: ["active"]
5517
5687
  },
5518
5688
  {
5519
5689
  id: "active",
5690
+ status_category: "started",
5520
5691
  label: "Active",
5521
5692
  description: "The test case is included in one or more test suites and is being executed.",
5522
5693
  transitions_to: ["deprecated"]
5523
5694
  },
5524
5695
  {
5525
5696
  id: "deprecated",
5697
+ status_category: "completed",
5526
5698
  label: "Deprecated",
5527
5699
  description: "The test case is no longer executed. The feature it covered may have changed or been removed.",
5528
5700
  transitions_to: []
@@ -5534,10 +5706,10 @@ var INSIGHT_LIFECYCLE = {
5534
5706
  initial_phase: "proposed",
5535
5707
  terminal_phases: ["applied", "retired"],
5536
5708
  phases: [
5537
- { id: "proposed", label: "Proposed", description: "A pattern has been synthesised from observations. Not yet cross-checked.", transitions_to: ["validated", "retired"] },
5538
- { id: "validated", label: "Validated", description: "The insight has been cross-checked against additional evidence. Believed reliable.", transitions_to: ["applied", "retired"] },
5539
- { id: "applied", label: "Applied", description: "The insight drove a product decision. Captured for the record.", transitions_to: ["retired"] },
5540
- { id: "retired", label: "Retired", description: "Superseded by newer insight, or no longer relevant. May reopen to proposed if revisited.", transitions_to: ["proposed"] }
5709
+ { id: "proposed", status_category: "triage", label: "Proposed", description: "A pattern has been synthesised from observations. Not yet cross-checked.", transitions_to: ["validated", "retired"] },
5710
+ { id: "validated", status_category: "started", label: "Validated", description: "The insight has been cross-checked against additional evidence. Believed reliable.", transitions_to: ["applied", "retired"] },
5711
+ { id: "applied", status_category: "completed", label: "Applied", description: "The insight drove a product decision. Captured for the record.", transitions_to: ["retired"] },
5712
+ { id: "retired", status_category: "completed", label: "Retired", description: "Superseded by newer insight, or no longer relevant. May reopen to proposed if revisited.", transitions_to: ["proposed"] }
5541
5713
  ]
5542
5714
  };
5543
5715
  var RESEARCH_QUESTION_LIFECYCLE = {
@@ -5545,10 +5717,10 @@ var RESEARCH_QUESTION_LIFECYCLE = {
5545
5717
  initial_phase: "open",
5546
5718
  terminal_phases: ["answered", "parked"],
5547
5719
  phases: [
5548
- { id: "open", label: "Open", description: "Question has been articulated. Research has not started.", transitions_to: ["researching", "parked"] },
5549
- { id: "researching", label: "Researching", description: "Active investigation. Methods are being run, evidence is being gathered.", transitions_to: ["answered", "parked"] },
5550
- { id: "answered", label: "Answered", description: "Question has been resolved. Findings captured in linked insights.", transitions_to: [] },
5551
- { id: "parked", label: "Parked", description: "Set aside due to capacity, priority, or dependency. May reopen to researching.", transitions_to: ["researching"] }
5720
+ { id: "open", status_category: "triage", label: "Open", description: "Question has been articulated. Research has not started.", transitions_to: ["researching", "parked"] },
5721
+ { id: "researching", status_category: "started", label: "Researching", description: "Active investigation. Methods are being run, evidence is being gathered.", transitions_to: ["answered", "parked"] },
5722
+ { id: "answered", status_category: "completed", label: "Answered", description: "Question has been resolved. Findings captured in linked insights.", transitions_to: [] },
5723
+ { id: "parked", status_category: "backlog", label: "Parked", description: "Set aside due to capacity, priority, or dependency. May reopen to researching.", transitions_to: ["researching"] }
5552
5724
  ]
5553
5725
  };
5554
5726
  var INTERVIEW_GUIDE_LIFECYCLE = {
@@ -5556,10 +5728,10 @@ var INTERVIEW_GUIDE_LIFECYCLE = {
5556
5728
  initial_phase: "drafting",
5557
5729
  terminal_phases: ["archived"],
5558
5730
  phases: [
5559
- { id: "drafting", label: "Drafting", description: "Guide is being authored or revised. Not yet ready for use.", transitions_to: ["ready"] },
5560
- { id: "ready", label: "Ready", description: "Guide is approved for use. May be picked up by a study.", transitions_to: ["in_use", "drafting"] },
5561
- { id: "in_use", label: "In Use", description: "Currently being run in one or more research_study entities.", transitions_to: ["ready", "archived"] },
5562
- { id: "archived", label: "Archived", description: "Retired from active use. May reopen to drafting if revived.", transitions_to: ["drafting"] }
5731
+ { id: "drafting", status_category: "started", label: "Drafting", description: "Guide is being authored or revised. Not yet ready for use.", transitions_to: ["ready"] },
5732
+ { id: "ready", status_category: "unstarted", label: "Ready", description: "Guide is approved for use. May be picked up by a study.", transitions_to: ["in_use", "drafting"] },
5733
+ { id: "in_use", status_category: "started", label: "In Use", description: "Currently being run in one or more research_study entities.", transitions_to: ["ready", "archived"] },
5734
+ { id: "archived", status_category: "completed", label: "Archived", description: "Retired from active use. May reopen to drafting if revived.", transitions_to: ["drafting"] }
5563
5735
  ]
5564
5736
  };
5565
5737
  var TEST_PLAN_LIFECYCLE = {
@@ -5567,10 +5739,10 @@ var TEST_PLAN_LIFECYCLE = {
5567
5739
  initial_phase: "drafted",
5568
5740
  terminal_phases: ["completed", "cancelled"],
5569
5741
  phases: [
5570
- { id: "drafted", label: "Drafted", description: "Plan has been authored. Not yet started.", transitions_to: ["executing", "cancelled"] },
5571
- { id: "executing", label: "Executing", description: "Tests are running according to the plan.", transitions_to: ["completed", "cancelled"] },
5572
- { id: "completed", label: "Completed", description: "All tests in the plan have run. Outcomes captured in linked test_result entities.", transitions_to: ["executing"] },
5573
- { id: "cancelled", label: "Cancelled", description: "Plan was abandoned mid-flight: assumption changed, priorities shifted, or the underlying code went away.", transitions_to: [] }
5742
+ { id: "drafted", status_category: "unstarted", label: "Drafted", description: "Plan has been authored. Not yet started.", transitions_to: ["executing", "cancelled"] },
5743
+ { id: "executing", status_category: "started", label: "Executing", description: "Tests are running according to the plan.", transitions_to: ["completed", "cancelled"] },
5744
+ { id: "completed", status_category: "completed", label: "Completed", description: "All tests in the plan have run. Outcomes captured in linked test_result entities.", transitions_to: ["executing"] },
5745
+ { id: "cancelled", status_category: "cancelled", label: "Cancelled", description: "Plan was abandoned mid-flight: assumption changed, priorities shifted, or the underlying code went away.", transitions_to: [] }
5574
5746
  ]
5575
5747
  };
5576
5748
  var AI_DATASET_LIFECYCLE = {
@@ -5578,10 +5750,10 @@ var AI_DATASET_LIFECYCLE = {
5578
5750
  initial_phase: "collecting",
5579
5751
  terminal_phases: ["versioned", "archived"],
5580
5752
  phases: [
5581
- { id: "collecting", label: "Collecting", description: "Examples are being gathered. Schema and labelling rules may still be in flux.", transitions_to: ["curated", "archived"] },
5582
- { id: "curated", label: "Curated", description: "Examples have been cleaned, deduped, and labelled. Ready for versioning.", transitions_to: ["versioned", "collecting"] },
5583
- { id: "versioned", label: "Versioned", description: "A specific cut has been pinned and is citable. New collection continues in a successor version.", transitions_to: ["archived"] },
5584
- { id: "archived", label: "Archived", description: "No longer in active use. May reopen to collecting if revived.", transitions_to: ["collecting"] }
5753
+ { id: "collecting", status_category: "started", label: "Collecting", description: "Examples are being gathered. Schema and labelling rules may still be in flux.", transitions_to: ["curated", "archived"] },
5754
+ { id: "curated", status_category: "started", label: "Curated", description: "Examples have been cleaned, deduped, and labelled. Ready for versioning.", transitions_to: ["versioned", "collecting"] },
5755
+ { id: "versioned", status_category: "completed", label: "Versioned", description: "A specific cut has been pinned and is citable. New collection continues in a successor version.", transitions_to: ["archived"] },
5756
+ { id: "archived", status_category: "completed", label: "Archived", description: "No longer in active use. May reopen to collecting if revived.", transitions_to: ["collecting"] }
5585
5757
  ]
5586
5758
  };
5587
5759
  var AI_GUARDRAIL_LIFECYCLE = {
@@ -5589,10 +5761,10 @@ var AI_GUARDRAIL_LIFECYCLE = {
5589
5761
  initial_phase: "proposed",
5590
5762
  terminal_phases: ["active", "relaxed", "removed"],
5591
5763
  phases: [
5592
- { id: "proposed", label: "Proposed", description: "Guardrail has been suggested. Not yet enforced.", transitions_to: ["active", "removed"] },
5593
- { id: "active", label: "Active", description: "Guardrail is enforced as designed. Currently the steady state.", transitions_to: ["relaxed", "removed"] },
5594
- { id: "relaxed", label: "Relaxed", description: "Guardrail is enforced more loosely than originally specified. Captured separately because the looser form has different implications.", transitions_to: ["active", "removed"] },
5595
- { id: "removed", label: "Removed", description: "Guardrail is no longer enforced. May reopen to active if reinstated.", transitions_to: ["active"] }
5764
+ { id: "proposed", status_category: "triage", label: "Proposed", description: "Guardrail has been suggested. Not yet enforced.", transitions_to: ["active", "removed"] },
5765
+ { id: "active", status_category: "started", label: "Active", description: "Guardrail is enforced as designed. Currently the steady state.", transitions_to: ["relaxed", "removed"] },
5766
+ { id: "relaxed", status_category: "started", label: "Relaxed", description: "Guardrail is enforced more loosely than originally specified. Captured separately because the looser form has different implications.", transitions_to: ["active", "removed"] },
5767
+ { id: "removed", status_category: "cancelled", label: "Removed", description: "Guardrail is no longer enforced. May reopen to active if reinstated.", transitions_to: ["active"] }
5596
5768
  ]
5597
5769
  };
5598
5770
  var MODEL_COMPARISON_LIFECYCLE = {
@@ -5600,10 +5772,10 @@ var MODEL_COMPARISON_LIFECYCLE = {
5600
5772
  initial_phase: "planned",
5601
5773
  terminal_phases: ["published", "archived"],
5602
5774
  phases: [
5603
- { id: "planned", label: "Planned", description: "Comparison has been scoped: models, criteria, and methodology are agreed.", transitions_to: ["running", "archived"] },
5604
- { id: "running", label: "Running", description: "Models are being evaluated against the chosen criteria.", transitions_to: ["published", "archived"] },
5605
- { id: "published", label: "Published", description: "Results are written up and citable. Drives downstream model selection.", transitions_to: ["archived", "planned"] },
5606
- { id: "archived", label: "Archived", description: "Superseded by newer comparison. May reopen to planned if re-run.", transitions_to: ["planned"] }
5775
+ { id: "planned", status_category: "unstarted", label: "Planned", description: "Comparison has been scoped: models, criteria, and methodology are agreed.", transitions_to: ["running", "archived"] },
5776
+ { id: "running", status_category: "started", label: "Running", description: "Models are being evaluated against the chosen criteria.", transitions_to: ["published", "archived"] },
5777
+ { id: "published", status_category: "completed", label: "Published", description: "Results are written up and citable. Drives downstream model selection.", transitions_to: ["archived", "planned"] },
5778
+ { id: "archived", status_category: "completed", label: "Archived", description: "Superseded by newer comparison. May reopen to planned if re-run.", transitions_to: ["planned"] }
5607
5779
  ]
5608
5780
  };
5609
5781
  var PROMPT_VERSION_LIFECYCLE = {
@@ -5611,10 +5783,10 @@ var PROMPT_VERSION_LIFECYCLE = {
5611
5783
  initial_phase: "drafted",
5612
5784
  terminal_phases: ["active", "deprecated"],
5613
5785
  phases: [
5614
- { id: "drafted", label: "Drafted", description: "Prompt has been authored. Not yet evaluated.", transitions_to: ["testing", "deprecated"] },
5615
- { id: "testing", label: "Testing", description: "Running through eval benchmarks. Results inform whether to promote.", transitions_to: ["active", "drafted", "deprecated"] },
5616
- { id: "active", label: "Active", description: "In production use.", transitions_to: ["deprecated"] },
5617
- { id: "deprecated", label: "Deprecated", description: "Superseded by a successor version. Still available for backwards-compat. May reopen to testing if reinstated.", transitions_to: ["testing"] }
5786
+ { id: "drafted", status_category: "unstarted", label: "Drafted", description: "Prompt has been authored. Not yet evaluated.", transitions_to: ["testing", "deprecated"] },
5787
+ { id: "testing", status_category: "started", label: "Testing", description: "Running through eval benchmarks. Results inform whether to promote.", transitions_to: ["active", "drafted", "deprecated"] },
5788
+ { id: "active", status_category: "started", label: "Active", description: "In production use.", transitions_to: ["deprecated"] },
5789
+ { id: "deprecated", status_category: "completed", label: "Deprecated", description: "Superseded by a successor version. Still available for backwards-compat. May reopen to testing if reinstated.", transitions_to: ["testing"] }
5618
5790
  ]
5619
5791
  };
5620
5792
  var EVAL_BENCHMARK_LIFECYCLE = {
@@ -5622,10 +5794,10 @@ var EVAL_BENCHMARK_LIFECYCLE = {
5622
5794
  initial_phase: "drafted",
5623
5795
  terminal_phases: ["published", "deprecated"],
5624
5796
  phases: [
5625
- { id: "drafted", label: "Drafted", description: "Benchmark questions and scoring rubric are being designed.", transitions_to: ["running", "deprecated"] },
5626
- { id: "running", label: "Running", description: "Benchmark is being executed against models or prompt versions.", transitions_to: ["published", "deprecated"] },
5627
- { id: "published", label: "Published", description: "Results are citable. Benchmark is part of the standard eval rotation.", transitions_to: ["deprecated", "running"] },
5628
- { id: "deprecated", label: "Deprecated", description: "Benchmark no longer reflects what the team measures. May reopen to drafted if revisited.", transitions_to: ["drafted"] }
5797
+ { id: "drafted", status_category: "unstarted", label: "Drafted", description: "Benchmark questions and scoring rubric are being designed.", transitions_to: ["running", "deprecated"] },
5798
+ { id: "running", status_category: "started", label: "Running", description: "Benchmark is being executed against models or prompt versions.", transitions_to: ["published", "deprecated"] },
5799
+ { id: "published", status_category: "completed", label: "Published", description: "Results are citable. Benchmark is part of the standard eval rotation.", transitions_to: ["deprecated", "running"] },
5800
+ { id: "deprecated", status_category: "completed", label: "Deprecated", description: "Benchmark no longer reflects what the team measures. May reopen to drafted if revisited.", transitions_to: ["drafted"] }
5629
5801
  ]
5630
5802
  };
5631
5803
  var BUSINESS_MODEL_LIFECYCLE = {
@@ -5633,11 +5805,11 @@ var BUSINESS_MODEL_LIFECYCLE = {
5633
5805
  initial_phase: "drafted",
5634
5806
  terminal_phases: ["validated", "invalidated", "pivoted"],
5635
5807
  phases: [
5636
- { id: "drafted", label: "Drafted", description: "Model has been articulated. Not yet tested in market.", transitions_to: ["testing", "invalidated"] },
5637
- { id: "testing", label: "Testing", description: "Model is being tested against real customers and revenue. Evidence is accumulating.", transitions_to: ["validated", "invalidated", "pivoted"] },
5638
- { id: "validated", label: "Validated", description: "Model holds up under real customer behaviour. Forms the operating basis.", transitions_to: ["testing", "pivoted"] },
5639
- { id: "invalidated", label: "Invalidated", description: "Model failed to hold up. May reopen to drafted for a new attempt.", transitions_to: ["drafted"] },
5640
- { id: "pivoted", label: "Pivoted", description: "Model became something structurally different. Captured as a milestone before the new model takes over.", transitions_to: [] }
5808
+ { id: "drafted", status_category: "unstarted", label: "Drafted", description: "Model has been articulated. Not yet tested in market.", transitions_to: ["testing", "invalidated"] },
5809
+ { id: "testing", status_category: "started", label: "Testing", description: "Model is being tested against real customers and revenue. Evidence is accumulating.", transitions_to: ["validated", "invalidated", "pivoted"] },
5810
+ { id: "validated", status_category: "completed", label: "Validated", description: "Model holds up under real customer behaviour. Forms the operating basis.", transitions_to: ["testing", "pivoted"] },
5811
+ { id: "invalidated", status_category: "completed", label: "Invalidated", description: "Model failed to hold up. May reopen to drafted for a new attempt.", transitions_to: ["drafted"] },
5812
+ { id: "pivoted", status_category: "cancelled", label: "Pivoted", description: "Model became something structurally different. Captured as a milestone before the new model takes over.", transitions_to: [] }
5641
5813
  ]
5642
5814
  };
5643
5815
  var REVENUE_STREAM_LIFECYCLE = {
@@ -5645,10 +5817,10 @@ var REVENUE_STREAM_LIFECYCLE = {
5645
5817
  initial_phase: "proposed",
5646
5818
  terminal_phases: ["live", "sunset"],
5647
5819
  phases: [
5648
- { id: "proposed", label: "Proposed", description: "Stream has been hypothesised. Not yet built or sold.", transitions_to: ["piloting", "sunset"] },
5649
- { id: "piloting", label: "Piloting", description: "Stream is being trialled with a limited audience. Pricing and packaging may still be in flux.", transitions_to: ["live", "sunset"] },
5650
- { id: "live", label: "Live", description: "Stream is generally available and generating revenue.", transitions_to: ["sunset"] },
5651
- { id: "sunset", label: "Sunset", description: "Stream is being wound down. May reopen to piloting if revived.", transitions_to: ["piloting"] }
5820
+ { id: "proposed", status_category: "triage", label: "Proposed", description: "Stream has been hypothesised. Not yet built or sold.", transitions_to: ["piloting", "sunset"] },
5821
+ { id: "piloting", status_category: "started", label: "Piloting", description: "Stream is being trialled with a limited audience. Pricing and packaging may still be in flux.", transitions_to: ["live", "sunset"] },
5822
+ { id: "live", status_category: "started", label: "Live", description: "Stream is generally available and generating revenue.", transitions_to: ["sunset"] },
5823
+ { id: "sunset", status_category: "completed", label: "Sunset", description: "Stream is being wound down. May reopen to piloting if revived.", transitions_to: ["piloting"] }
5652
5824
  ]
5653
5825
  };
5654
5826
  var CUSTOMER_HEALTH_SCORE_LIFECYCLE = {
@@ -5656,11 +5828,11 @@ var CUSTOMER_HEALTH_SCORE_LIFECYCLE = {
5656
5828
  initial_phase: "monitoring",
5657
5829
  terminal_phases: ["recovered", "churned"],
5658
5830
  phases: [
5659
- { id: "monitoring", label: "Monitoring", description: "Customer is healthy. Score is being tracked passively.", transitions_to: ["at_risk", "churned", "recovered"] },
5660
- { id: "at_risk", label: "At Risk", description: "Signals indicate trouble. Customer Success has flagged the account for attention.", transitions_to: ["monitoring", "critical", "churned", "recovered"] },
5661
- { id: "critical", label: "Critical", description: "Customer is on the verge of churning. Active intervention is underway.", transitions_to: ["at_risk", "recovered", "churned"] },
5662
- { id: "recovered", label: "Recovered", description: "Customer health has returned to monitoring. Captured as a milestone. May reopen to monitoring naturally.", transitions_to: ["monitoring"] },
5663
- { id: "churned", label: "Churned", description: "Customer left. Captured for analysis; reopen would mean a new customer relationship.", transitions_to: [] }
5831
+ { id: "monitoring", status_category: "started", label: "Monitoring", description: "Customer is healthy. Score is being tracked passively.", transitions_to: ["at_risk", "churned", "recovered"] },
5832
+ { id: "at_risk", status_category: "started", label: "At Risk", description: "Signals indicate trouble. Customer Success has flagged the account for attention.", transitions_to: ["monitoring", "critical", "churned", "recovered"] },
5833
+ { id: "critical", status_category: "started", label: "Critical", description: "Customer is on the verge of churning. Active intervention is underway.", transitions_to: ["at_risk", "recovered", "churned"] },
5834
+ { id: "recovered", status_category: "completed", label: "Recovered", description: "Customer health has returned to monitoring. Captured as a milestone. May reopen to monitoring naturally.", transitions_to: ["monitoring"] },
5835
+ { id: "churned", status_category: "cancelled", label: "Churned", description: "Customer left. Captured for analysis; reopen would mean a new customer relationship.", transitions_to: [] }
5664
5836
  ]
5665
5837
  };
5666
5838
  var PLAYBOOK_LIFECYCLE = {
@@ -5668,10 +5840,10 @@ var PLAYBOOK_LIFECYCLE = {
5668
5840
  initial_phase: "drafted",
5669
5841
  terminal_phases: ["live", "retired"],
5670
5842
  phases: [
5671
- { id: "drafted", label: "Drafted", description: "Playbook is being authored. Not yet tested with customers.", transitions_to: ["tested", "retired"] },
5672
- { id: "tested", label: "Tested", description: "Playbook has been run through pilot customers. Adjustments may follow.", transitions_to: ["live", "drafted"] },
5673
- { id: "live", label: "Live", description: "Playbook is in active use across the customer success team.", transitions_to: ["retired", "tested"] },
5674
- { id: "retired", label: "Retired", description: "Playbook no longer in use. May reopen to drafted if revived.", transitions_to: ["drafted"] }
5843
+ { id: "drafted", status_category: "unstarted", label: "Drafted", description: "Playbook is being authored. Not yet tested with customers.", transitions_to: ["tested", "retired"] },
5844
+ { id: "tested", status_category: "started", label: "Tested", description: "Playbook has been run through pilot customers. Adjustments may follow.", transitions_to: ["live", "drafted"] },
5845
+ { id: "live", status_category: "started", label: "Live", description: "Playbook is in active use across the customer success team.", transitions_to: ["retired", "tested"] },
5846
+ { id: "retired", status_category: "completed", label: "Retired", description: "Playbook no longer in use. May reopen to drafted if revived.", transitions_to: ["drafted"] }
5675
5847
  ]
5676
5848
  };
5677
5849
  var TEAM_OKR_LIFECYCLE = {
@@ -5679,11 +5851,11 @@ var TEAM_OKR_LIFECYCLE = {
5679
5851
  initial_phase: "drafted",
5680
5852
  terminal_phases: ["completed", "missed"],
5681
5853
  phases: [
5682
- { id: "drafted", label: "Drafted", description: "OKR is being authored. Not yet committed to.", transitions_to: ["committed"] },
5683
- { id: "committed", label: "Committed", description: "Team has agreed to pursue the OKR. Cycle has not yet started.", transitions_to: ["in_progress", "drafted"] },
5684
- { id: "in_progress", label: "In Progress", description: "Cycle is underway. Progress is being tracked.", transitions_to: ["completed", "missed"] },
5685
- { id: "completed", label: "Completed", description: "OKR was achieved within the cycle.", transitions_to: [] },
5686
- { id: "missed", label: "Missed", description: "OKR was not achieved. May reopen to in_progress if carried forward.", transitions_to: ["in_progress"] }
5854
+ { id: "drafted", status_category: "unstarted", label: "Drafted", description: "OKR is being authored. Not yet committed to.", transitions_to: ["committed"] },
5855
+ { id: "committed", status_category: "unstarted", label: "Committed", description: "Team has agreed to pursue the OKR. Cycle has not yet started.", transitions_to: ["in_progress", "drafted"] },
5856
+ { id: "in_progress", status_category: "started", label: "In Progress", description: "Cycle is underway. Progress is being tracked.", transitions_to: ["completed", "missed"] },
5857
+ { id: "completed", status_category: "completed", label: "Completed", description: "OKR was achieved within the cycle.", transitions_to: [] },
5858
+ { id: "missed", status_category: "completed", label: "Missed", description: "OKR was not achieved. May reopen to in_progress if carried forward.", transitions_to: ["in_progress"] }
5687
5859
  ]
5688
5860
  };
5689
5861
  var RETROSPECTIVE_LIFECYCLE = {
@@ -5691,10 +5863,10 @@ var RETROSPECTIVE_LIFECYCLE = {
5691
5863
  initial_phase: "scheduled",
5692
5864
  terminal_phases: ["completed", "actions_tracked"],
5693
5865
  phases: [
5694
- { id: "scheduled", label: "Scheduled", description: "Retro is on the calendar. Not yet held.", transitions_to: ["in_progress", "completed"] },
5695
- { id: "in_progress", label: "In Progress", description: "Retro is being held.", transitions_to: ["completed"] },
5696
- { id: "completed", label: "Completed", description: "Meeting is done. Action items captured but not yet tracked to closure.", transitions_to: ["actions_tracked"] },
5697
- { id: "actions_tracked", label: "Actions Tracked", description: "Retro action items have been completed or explicitly dropped. Full loop closed.", transitions_to: [] }
5866
+ { id: "scheduled", status_category: "unstarted", label: "Scheduled", description: "Retro is on the calendar. Not yet held.", transitions_to: ["in_progress", "completed"] },
5867
+ { id: "in_progress", status_category: "started", label: "In Progress", description: "Retro is being held.", transitions_to: ["completed"] },
5868
+ { id: "completed", status_category: "completed", label: "Completed", description: "Meeting is done. Action items captured but not yet tracked to closure.", transitions_to: ["actions_tracked"] },
5869
+ { id: "actions_tracked", status_category: "completed", label: "Actions Tracked", description: "Retro action items have been completed or explicitly dropped. Full loop closed.", transitions_to: [] }
5698
5870
  ]
5699
5871
  };
5700
5872
  var DEPENDENCY_LIFECYCLE = {
@@ -5702,10 +5874,10 @@ var DEPENDENCY_LIFECYCLE = {
5702
5874
  initial_phase: "identified",
5703
5875
  terminal_phases: ["resolved"],
5704
5876
  phases: [
5705
- { id: "identified", label: "Identified", description: "Dependency has been named. Not yet evaluated for impact.", transitions_to: ["blocked", "in_progress", "resolved"] },
5706
- { id: "blocked", label: "Blocked", description: "Dependency is currently blocking work. Awaiting upstream action.", transitions_to: ["in_progress", "resolved"] },
5707
- { id: "in_progress", label: "In Progress", description: "Active work is happening to resolve the dependency.", transitions_to: ["blocked", "resolved"] },
5708
- { id: "resolved", label: "Resolved", description: "Dependency is no longer blocking. May reopen to blocked if regression.", transitions_to: ["blocked"] }
5877
+ { id: "identified", status_category: "triage", label: "Identified", description: "Dependency has been named. Not yet evaluated for impact.", transitions_to: ["blocked", "in_progress", "resolved"] },
5878
+ { id: "blocked", status_category: "started", label: "Blocked", description: "Dependency is currently blocking work. Awaiting upstream action.", transitions_to: ["in_progress", "resolved"] },
5879
+ { id: "in_progress", status_category: "started", label: "In Progress", description: "Active work is happening to resolve the dependency.", transitions_to: ["blocked", "resolved"] },
5880
+ { id: "resolved", status_category: "completed", label: "Resolved", description: "Dependency is no longer blocking. May reopen to blocked if regression.", transitions_to: ["blocked"] }
5709
5881
  ]
5710
5882
  };
5711
5883
  var ROLE_LIFECYCLE = {
@@ -5713,10 +5885,10 @@ var ROLE_LIFECYCLE = {
5713
5885
  initial_phase: "proposed",
5714
5886
  terminal_phases: ["filled", "vacant"],
5715
5887
  phases: [
5716
- { id: "proposed", label: "Proposed", description: "Role has been described but not yet posted or staffed.", transitions_to: ["open", "vacant"] },
5717
- { id: "open", label: "Open", description: "Role is actively being recruited for.", transitions_to: ["filled", "vacant"] },
5718
- { id: "filled", label: "Filled", description: "Role is staffed. May reopen to open if the position becomes vacant again.", transitions_to: ["vacant"] },
5719
- { id: "vacant", label: "Vacant", description: "Role exists but is unfilled. May reopen to open to start recruiting.", transitions_to: ["open"] }
5888
+ { id: "proposed", status_category: "triage", label: "Proposed", description: "Role has been described but not yet posted or staffed.", transitions_to: ["open", "vacant"] },
5889
+ { id: "open", status_category: "started", label: "Open", description: "Role is actively being recruited for.", transitions_to: ["filled", "vacant"] },
5890
+ { id: "filled", status_category: "completed", label: "Filled", description: "Role is staffed. May reopen to open if the position becomes vacant again.", transitions_to: ["vacant"] },
5891
+ { id: "vacant", status_category: "backlog", label: "Vacant", description: "Role exists but is unfilled. May reopen to open to start recruiting.", transitions_to: ["open"] }
5720
5892
  ]
5721
5893
  };
5722
5894
  var CAPACITY_PLAN_LIFECYCLE = {
@@ -5724,11 +5896,11 @@ var CAPACITY_PLAN_LIFECYCLE = {
5724
5896
  initial_phase: "drafted",
5725
5897
  terminal_phases: ["completed", "revised"],
5726
5898
  phases: [
5727
- { id: "drafted", label: "Drafted", description: "Plan is being authored. Not yet agreed.", transitions_to: ["committed", "revised"] },
5728
- { id: "committed", label: "Committed", description: "Plan has been agreed by stakeholders. Cycle has not yet started.", transitions_to: ["in_flight", "revised"] },
5729
- { id: "in_flight", label: "In Flight", description: "Cycle is underway. Capacity is being consumed.", transitions_to: ["completed", "revised"] },
5730
- { id: "completed", label: "Completed", description: "Cycle is done. Plan executed as agreed.", transitions_to: [] },
5731
- { id: "revised", label: "Revised", description: "Plan was changed mid-flight. May reopen to drafted for the next iteration.", transitions_to: ["drafted"] }
5899
+ { id: "drafted", status_category: "unstarted", label: "Drafted", description: "Plan is being authored. Not yet agreed.", transitions_to: ["committed", "revised"] },
5900
+ { id: "committed", status_category: "unstarted", label: "Committed", description: "Plan has been agreed by stakeholders. Cycle has not yet started.", transitions_to: ["in_flight", "revised"] },
5901
+ { id: "in_flight", status_category: "started", label: "In Flight", description: "Cycle is underway. Capacity is being consumed.", transitions_to: ["completed", "revised"] },
5902
+ { id: "completed", status_category: "completed", label: "Completed", description: "Cycle is done. Plan executed as agreed.", transitions_to: [] },
5903
+ { id: "revised", status_category: "completed", label: "Revised", description: "Plan was changed mid-flight. May reopen to drafted for the next iteration.", transitions_to: ["drafted"] }
5732
5904
  ]
5733
5905
  };
5734
5906
  var VARIANT_LIFECYCLE = {
@@ -5736,11 +5908,11 @@ var VARIANT_LIFECYCLE = {
5736
5908
  initial_phase: "proposed",
5737
5909
  terminal_phases: ["winning", "losing", "retired"],
5738
5910
  phases: [
5739
- { id: "proposed", label: "Proposed", description: "Variant has been designed. Not yet running.", transitions_to: ["live", "retired"] },
5740
- { id: "live", label: "Live", description: "Variant is being shown to users as part of an active test.", transitions_to: ["winning", "losing", "retired"] },
5741
- { id: "winning", label: "Winning", description: "Variant beat the control. Captured for the record before rollout.", transitions_to: ["retired"] },
5742
- { id: "losing", label: "Losing", description: "Variant did not beat the control. Captured for the record.", transitions_to: ["retired"] },
5743
- { id: "retired", label: "Retired", description: "Variant is no longer running. May reopen to proposed if revisited in a future test.", transitions_to: ["proposed"] }
5911
+ { id: "proposed", status_category: "triage", label: "Proposed", description: "Variant has been designed. Not yet running.", transitions_to: ["live", "retired"] },
5912
+ { id: "live", status_category: "started", label: "Live", description: "Variant is being shown to users as part of an active test.", transitions_to: ["winning", "losing", "retired"] },
5913
+ { id: "winning", status_category: "completed", label: "Winning", description: "Variant beat the control. Captured for the record before rollout.", transitions_to: ["retired"] },
5914
+ { id: "losing", status_category: "completed", label: "Losing", description: "Variant did not beat the control. Captured for the record.", transitions_to: ["retired"] },
5915
+ { id: "retired", status_category: "completed", label: "Retired", description: "Variant is no longer running. May reopen to proposed if revisited in a future test.", transitions_to: ["proposed"] }
5744
5916
  ]
5745
5917
  };
5746
5918
  var GROWTH_CAMPAIGN_LIFECYCLE = {
@@ -5748,11 +5920,11 @@ var GROWTH_CAMPAIGN_LIFECYCLE = {
5748
5920
  initial_phase: "drafted",
5749
5921
  terminal_phases: ["completed", "paused"],
5750
5922
  phases: [
5751
- { id: "drafted", label: "Drafted", description: "Campaign concept exists. Not yet planned for launch.", transitions_to: ["planning", "paused"] },
5752
- { id: "planning", label: "Planning", description: "Campaign creative, channels, and timing are being finalised.", transitions_to: ["live", "paused"] },
5753
- { id: "live", label: "Live", description: "Campaign is running across channels.", transitions_to: ["completed", "paused"] },
5754
- { id: "completed", label: "Completed", description: "Campaign ran to completion. Outcomes captured.", transitions_to: [] },
5755
- { id: "paused", label: "Paused", description: "Campaign was halted before completion. May reopen to live if resumed.", transitions_to: ["live"] }
5923
+ { id: "drafted", status_category: "unstarted", label: "Drafted", description: "Campaign concept exists. Not yet planned for launch.", transitions_to: ["planning", "paused"] },
5924
+ { id: "planning", status_category: "unstarted", label: "Planning", description: "Campaign creative, channels, and timing are being finalised.", transitions_to: ["live", "paused"] },
5925
+ { id: "live", status_category: "started", label: "Live", description: "Campaign is running across channels.", transitions_to: ["completed", "paused"] },
5926
+ { id: "completed", status_category: "completed", label: "Completed", description: "Campaign ran to completion. Outcomes captured.", transitions_to: [] },
5927
+ { id: "paused", status_category: "backlog", label: "Paused", description: "Campaign was halted before completion. May reopen to live if resumed.", transitions_to: ["live"] }
5756
5928
  ]
5757
5929
  };
5758
5930
  function fromTemplate(entityType, template) {
@@ -5763,10 +5935,10 @@ var PUBLISHING_TEMPLATE = {
5763
5935
  initial_phase: "draft",
5764
5936
  terminal_phases: ["archived"],
5765
5937
  phases: [
5766
- { id: "draft", label: "Draft", description: "Being authored or revised. Not visible externally.", transitions_to: ["review"] },
5767
- { id: "review", label: "In Review", description: "Under editorial or stakeholder review before publishing.", transitions_to: ["draft", "published"] },
5768
- { id: "published", label: "Published", description: "Live and visible to the intended audience.", transitions_to: ["archived", "draft"] },
5769
- { id: "archived", label: "Archived", description: "No longer current. Retained for historical reference.", transitions_to: ["draft"] }
5938
+ { id: "draft", status_category: "started", label: "Draft", description: "Being authored or revised. Not visible externally.", transitions_to: ["review"] },
5939
+ { id: "review", status_category: "started", label: "In Review", description: "Under editorial or stakeholder review before publishing.", transitions_to: ["draft", "published"] },
5940
+ { id: "published", status_category: "completed", label: "Published", description: "Live and visible to the intended audience.", transitions_to: ["archived", "draft"] },
5941
+ { id: "archived", status_category: "completed", label: "Archived", description: "No longer current. Retained for historical reference.", transitions_to: ["draft"] }
5770
5942
  ]
5771
5943
  };
5772
5944
  var OPERATIONAL_TEMPLATE = {
@@ -5774,11 +5946,11 @@ var OPERATIONAL_TEMPLATE = {
5774
5946
  initial_phase: "planning",
5775
5947
  terminal_phases: ["completed", "sunset"],
5776
5948
  phases: [
5777
- { id: "planning", label: "Planning", description: "Being designed or scoped. Not yet started.", transitions_to: ["active"] },
5778
- { id: "active", label: "Active", description: "Currently running or in operation.", transitions_to: ["paused", "completed", "sunset"] },
5779
- { id: "paused", label: "Paused", description: "Temporarily halted. Can be resumed.", transitions_to: ["active", "sunset"] },
5780
- { id: "completed", label: "Completed", description: "Finished successfully. Outcomes captured.", transitions_to: [] },
5781
- { id: "sunset", label: "Sunset", description: "Winding down or discontinued.", transitions_to: [] }
5949
+ { id: "planning", status_category: "unstarted", label: "Planning", description: "Being designed or scoped. Not yet started.", transitions_to: ["active"] },
5950
+ { id: "active", status_category: "started", label: "Active", description: "Currently running or in operation.", transitions_to: ["paused", "completed", "sunset"] },
5951
+ { id: "paused", status_category: "backlog", label: "Paused", description: "Temporarily halted. Can be resumed.", transitions_to: ["active", "sunset"] },
5952
+ { id: "completed", status_category: "completed", label: "Completed", description: "Finished successfully. Outcomes captured.", transitions_to: [] },
5953
+ { id: "sunset", status_category: "completed", label: "Sunset", description: "Winding down or discontinued.", transitions_to: [] }
5782
5954
  ]
5783
5955
  };
5784
5956
  var APPROVAL_TEMPLATE = {
@@ -5790,22 +5962,23 @@ var APPROVAL_TEMPLATE = {
5790
5962
  // UPGLifecycle.terminal_phases contract.
5791
5963
  terminal_phases: ["approved", "rejected", "deprecated"],
5792
5964
  phases: [
5793
- { id: "proposed", label: "Proposed", description: "Submitted for consideration. Awaiting review.", transitions_to: ["reviewing"] },
5794
- { id: "reviewing", label: "Reviewing", description: "Under active review by approvers.", transitions_to: ["approved", "rejected", "proposed"] },
5795
- { id: "approved", label: "Approved", description: "Accepted and ready for implementation.", transitions_to: ["deprecated"] },
5796
- { id: "rejected", label: "Rejected", description: "Not accepted. Reasons should be documented.", transitions_to: ["proposed"] },
5797
- { id: "deprecated", label: "Deprecated", description: "Previously approved but no longer current.", transitions_to: [] }
5965
+ { id: "proposed", status_category: "triage", label: "Proposed", description: "Submitted for consideration. Awaiting review.", transitions_to: ["reviewing"] },
5966
+ { id: "reviewing", status_category: "started", label: "Reviewing", description: "Under active review by approvers.", transitions_to: ["approved", "rejected", "proposed"] },
5967
+ { id: "approved", status_category: "completed", label: "Approved", description: "Accepted and ready for implementation.", transitions_to: ["deprecated"] },
5968
+ { id: "rejected", status_category: "cancelled", label: "Rejected", description: "Not accepted. Reasons should be documented.", transitions_to: ["proposed"] },
5969
+ { id: "deprecated", status_category: "completed", label: "Deprecated", description: "Previously approved but no longer current.", transitions_to: [] }
5798
5970
  ]
5799
5971
  };
5800
5972
  var WORK_ITEM_TEMPLATE = {
5801
5973
  template_id: "WORK_ITEM",
5802
5974
  initial_phase: "todo",
5803
- terminal_phases: ["done"],
5975
+ terminal_phases: ["done", "cancelled"],
5804
5976
  phases: [
5805
- { id: "todo", label: "To Do", description: "Identified but not yet started.", transitions_to: ["in_progress"] },
5806
- { id: "in_progress", label: "In Progress", description: "Actively being worked on.", transitions_to: ["in_review", "todo"] },
5807
- { id: "in_review", label: "In Review", description: "Work completed, awaiting review or acceptance.", transitions_to: ["done", "in_progress"] },
5808
- { id: "done", label: "Done", description: "Completed and accepted.", transitions_to: [] }
5977
+ { id: "todo", status_category: "unstarted", label: "To Do", description: "Identified but not yet started.", transitions_to: ["in_progress", "cancelled"] },
5978
+ { id: "in_progress", status_category: "started", label: "In Progress", description: "Actively being worked on.", transitions_to: ["in_review", "todo", "cancelled"] },
5979
+ { id: "in_review", status_category: "started", label: "In Review", description: "Work completed, awaiting review or acceptance.", transitions_to: ["done", "in_progress", "cancelled"] },
5980
+ { id: "done", status_category: "completed", label: "Done", description: "Completed and accepted.", transitions_to: [] },
5981
+ { id: "cancelled", status_category: "cancelled", label: "Cancelled", description: "Deliberately closed without completion: won't-do, duplicate, or obsolete. May reopen to `todo` if circumstances change.", transitions_to: ["todo"] }
5809
5982
  ]
5810
5983
  };
5811
5984
  var DISCOVERY_TEMPLATE = {
@@ -5813,10 +5986,10 @@ var DISCOVERY_TEMPLATE = {
5813
5986
  initial_phase: "open",
5814
5987
  terminal_phases: ["resolved", "parked"],
5815
5988
  phases: [
5816
- { id: "open", label: "Open", description: "Identified as worth exploring. No work started yet.", transitions_to: ["exploring"] },
5817
- { id: "exploring", label: "Exploring", description: "Actively being investigated or researched.", transitions_to: ["resolved", "parked", "open"] },
5818
- { id: "resolved", label: "Resolved", description: "Answered or addressed. Findings captured.", transitions_to: [] },
5819
- { id: "parked", label: "Parked", description: "Set aside for now. May revisit later.", transitions_to: ["open"] }
5989
+ { id: "open", status_category: "triage", label: "Open", description: "Identified as worth exploring. No work started yet.", transitions_to: ["exploring"] },
5990
+ { id: "exploring", status_category: "started", label: "Exploring", description: "Actively being investigated or researched.", transitions_to: ["resolved", "parked", "open"] },
5991
+ { id: "resolved", status_category: "completed", label: "Resolved", description: "Answered or addressed. Findings captured.", transitions_to: [] },
5992
+ { id: "parked", status_category: "backlog", label: "Parked", description: "Set aside for now. May revisit later.", transitions_to: ["open"] }
5820
5993
  ]
5821
5994
  };
5822
5995
  var MATURITY_TEMPLATE = {
@@ -5824,10 +5997,10 @@ var MATURITY_TEMPLATE = {
5824
5997
  initial_phase: "alpha",
5825
5998
  terminal_phases: ["deprecated"],
5826
5999
  phases: [
5827
- { id: "alpha", label: "Alpha", description: "Early stage, internal use only. Expect breaking changes.", transitions_to: ["beta"] },
5828
- { id: "beta", label: "Beta", description: "Feature complete but may have rough edges. Limited external use.", transitions_to: ["ga", "alpha"] },
5829
- { id: "ga", label: "Generally Available", description: "Stable, production-ready. Widely available.", transitions_to: ["deprecated"] },
5830
- { id: "deprecated", label: "Deprecated", description: "Scheduled for removal. Migration path should be documented.", transitions_to: [] }
6000
+ { id: "alpha", status_category: "started", label: "Alpha", description: "Early stage, internal use only. Expect breaking changes.", transitions_to: ["beta"] },
6001
+ { id: "beta", status_category: "started", label: "Beta", description: "Feature complete but may have rough edges. Limited external use.", transitions_to: ["ga", "alpha"] },
6002
+ { id: "ga", status_category: "completed", label: "Generally Available", description: "Stable, production-ready. Widely available.", transitions_to: ["deprecated"] },
6003
+ { id: "deprecated", status_category: "completed", label: "Deprecated", description: "Scheduled for removal. Migration path should be documented.", transitions_to: [] }
5831
6004
  ]
5832
6005
  };
5833
6006
  var RISK_ITEM_TEMPLATE = {
@@ -5835,11 +6008,11 @@ var RISK_ITEM_TEMPLATE = {
5835
6008
  initial_phase: "identified",
5836
6009
  terminal_phases: ["mitigated", "accepted", "closed"],
5837
6010
  phases: [
5838
- { id: "identified", label: "Identified", description: "Risk has been recognised and named. Not yet assessed for likelihood or impact.", transitions_to: ["assessed"] },
5839
- { id: "assessed", label: "Assessed", description: "Likelihood and impact have been evaluated. Outcome is one of mitigated, accepted, or closed.", transitions_to: ["mitigated", "accepted", "closed"] },
5840
- { id: "mitigated", label: "Mitigated", description: "Action has been taken to reduce likelihood or impact. The risk is no longer active.", transitions_to: [] },
5841
- { id: "accepted", label: "Accepted", description: "Risk is acknowledged. Cost of mitigation outweighs exposure; the team chooses to live with it.", transitions_to: [] },
5842
- { id: "closed", label: "Closed", description: "Risk became irrelevant without action; underlying conditions changed. May reopen to `assessed` if conditions change again.", transitions_to: ["assessed"] }
6011
+ { id: "identified", status_category: "triage", label: "Identified", description: "Risk has been recognised and named. Not yet assessed for likelihood or impact.", transitions_to: ["assessed"] },
6012
+ { id: "assessed", status_category: "started", label: "Assessed", description: "Likelihood and impact have been evaluated. Outcome is one of mitigated, accepted, or closed.", transitions_to: ["mitigated", "accepted", "closed"] },
6013
+ { id: "mitigated", status_category: "completed", label: "Mitigated", description: "Action has been taken to reduce likelihood or impact. The risk is no longer active.", transitions_to: [] },
6014
+ { id: "accepted", status_category: "completed", label: "Accepted", description: "Risk is acknowledged. Cost of mitigation outweighs exposure; the team chooses to live with it.", transitions_to: [] },
6015
+ { id: "closed", status_category: "completed", label: "Closed", description: "Risk became irrelevant without action; underlying conditions changed. May reopen to `assessed` if conditions change again.", transitions_to: ["assessed"] }
5843
6016
  ]
5844
6017
  };
5845
6018
  var SALES_DEAL_TEMPLATE = {
@@ -5847,11 +6020,11 @@ var SALES_DEAL_TEMPLATE = {
5847
6020
  initial_phase: "qualified",
5848
6021
  terminal_phases: ["closed_won", "closed_lost"],
5849
6022
  phases: [
5850
- { id: "qualified", label: "Qualified", description: "Lead has been qualified: there's a real budget, need, and decision-maker. Not yet pitched.", transitions_to: ["proposal"] },
5851
- { id: "proposal", label: "Proposal", description: "A proposal has been delivered. Pricing and scope are on the table.", transitions_to: ["negotiation", "closed_lost"] },
5852
- { id: "negotiation", label: "Negotiation", description: "Terms are being finalised. Both sides are working toward agreement.", transitions_to: ["closed_won", "closed_lost"] },
5853
- { id: "closed_won", label: "Closed Won", description: "Deal signed. Customer is now active.", transitions_to: [] },
5854
- { id: "closed_lost", label: "Closed Lost", description: "Deal did not close. A re-engaged prospect becomes a new `deal` rather than reviving this one.", transitions_to: [] }
6023
+ { id: "qualified", status_category: "triage", label: "Qualified", description: "Lead has been qualified: there's a real budget, need, and decision-maker. Not yet pitched.", transitions_to: ["proposal"] },
6024
+ { id: "proposal", status_category: "started", label: "Proposal", description: "A proposal has been delivered. Pricing and scope are on the table.", transitions_to: ["negotiation", "closed_lost"] },
6025
+ { id: "negotiation", status_category: "started", label: "Negotiation", description: "Terms are being finalised. Both sides are working toward agreement.", transitions_to: ["closed_won", "closed_lost"] },
6026
+ { id: "closed_won", status_category: "completed", label: "Closed Won", description: "Deal signed. Customer is now active.", transitions_to: [] },
6027
+ { id: "closed_lost", status_category: "completed", label: "Closed Lost", description: "Deal did not close. A re-engaged prospect becomes a new `deal` rather than reviving this one.", transitions_to: [] }
5855
6028
  ]
5856
6029
  };
5857
6030
  var VALIDATION_TEMPLATE = {
@@ -5859,11 +6032,11 @@ var VALIDATION_TEMPLATE = {
5859
6032
  initial_phase: "untested",
5860
6033
  terminal_phases: ["validated", "invalidated", "archived"],
5861
6034
  phases: [
5862
- { id: "untested", label: "Untested", description: "Articulated but not yet examined against evidence.", transitions_to: ["testing"] },
5863
- { id: "testing", label: "Testing", description: "Actively gathering evidence for or against the claim.", transitions_to: ["validated", "invalidated"] },
5864
- { id: "validated", label: "Validated", description: "Evidence supports the claim. Treated as true until contradicted.", transitions_to: ["archived"] },
5865
- { id: "invalidated", label: "Invalidated", description: "Evidence contradicts the claim. May re-test if new evidence appears.", transitions_to: ["archived", "testing"] },
5866
- { id: "archived", label: "Archived", description: "Settled and retained for provenance. No longer active.", transitions_to: [] }
6035
+ { id: "untested", status_category: "triage", label: "Untested", description: "Articulated but not yet examined against evidence.", transitions_to: ["testing"] },
6036
+ { id: "testing", status_category: "started", label: "Testing", description: "Actively gathering evidence for or against the claim.", transitions_to: ["validated", "invalidated"] },
6037
+ { id: "validated", status_category: "completed", label: "Validated", description: "Evidence supports the claim. Treated as true until contradicted.", transitions_to: ["archived"] },
6038
+ { id: "invalidated", status_category: "completed", label: "Invalidated", description: "Evidence contradicts the claim. May re-test if new evidence appears.", transitions_to: ["archived", "testing"] },
6039
+ { id: "archived", status_category: "completed", label: "Archived", description: "Settled and retained for provenance. No longer active.", transitions_to: [] }
5867
6040
  ]
5868
6041
  };
5869
6042
  var INCIDENT_TEMPLATE = {
@@ -5871,12 +6044,12 @@ var INCIDENT_TEMPLATE = {
5871
6044
  initial_phase: "open",
5872
6045
  terminal_phases: ["resolved", "closed", "wont_fix"],
5873
6046
  phases: [
5874
- { id: "open", label: "Open", description: "Surfaced and logged. Not yet triaged.", transitions_to: ["triaged"] },
5875
- { id: "triaged", label: "Triaged", description: "Assessed for severity and ownership. Routed for work or dispositioned.", transitions_to: ["in_progress", "resolved", "wont_fix"] },
5876
- { id: "in_progress", label: "In Progress", description: "Actively being worked toward a fix.", transitions_to: ["resolved", "wont_fix"] },
5877
- { id: "resolved", label: "Resolved", description: "Addressed and verified. May reopen to `triaged` on regression.", transitions_to: ["closed", "triaged"] },
5878
- { id: "closed", label: "Closed", description: "Administratively closed (duplicate, withdrawn, or no longer relevant).", transitions_to: [] },
5879
- { id: "wont_fix", label: "Won't Fix", description: "Triaged as not to be actioned. Reason should be documented.", transitions_to: [] }
6047
+ { id: "open", status_category: "triage", label: "Open", description: "Surfaced and logged. Not yet triaged.", transitions_to: ["triaged"] },
6048
+ { id: "triaged", status_category: "triage", label: "Triaged", description: "Assessed for severity and ownership. Routed for work or dispositioned.", transitions_to: ["in_progress", "resolved", "wont_fix"] },
6049
+ { id: "in_progress", status_category: "started", label: "In Progress", description: "Actively being worked toward a fix.", transitions_to: ["resolved", "wont_fix"] },
6050
+ { id: "resolved", status_category: "completed", label: "Resolved", description: "Addressed and verified. May reopen to `triaged` on regression.", transitions_to: ["closed", "triaged"] },
6051
+ { id: "closed", status_category: "cancelled", label: "Closed", description: "Administratively closed (duplicate, withdrawn, or no longer relevant).", transitions_to: [] },
6052
+ { id: "wont_fix", status_category: "cancelled", label: "Won't Fix", description: "Triaged as not to be actioned. Reason should be documented.", transitions_to: [] }
5880
6053
  ]
5881
6054
  };
5882
6055
  var STUDY_TEMPLATE = {
@@ -5884,11 +6057,11 @@ var STUDY_TEMPLATE = {
5884
6057
  initial_phase: "planned",
5885
6058
  terminal_phases: ["complete", "abandoned"],
5886
6059
  phases: [
5887
- { id: "planned", label: "Planned", description: "Scoped and scheduled. Not yet started.", transitions_to: ["running"] },
5888
- { id: "running", label: "Running", description: "Actively executing: collecting data or running the protocol.", transitions_to: ["analysing", "abandoned"] },
5889
- { id: "analysing", label: "Analysing", description: "Execution done; results are being analysed and written up.", transitions_to: ["complete", "abandoned"] },
5890
- { id: "complete", label: "Complete", description: "Analysed and concluded. Findings captured.", transitions_to: [] },
5891
- { id: "abandoned", label: "Abandoned", description: "Stopped before completion (killed, timed out, or superseded).", transitions_to: [] }
6060
+ { id: "planned", status_category: "unstarted", label: "Planned", description: "Scoped and scheduled. Not yet started.", transitions_to: ["running"] },
6061
+ { id: "running", status_category: "started", label: "Running", description: "Actively executing: collecting data or running the protocol.", transitions_to: ["analysing", "abandoned"] },
6062
+ { id: "analysing", status_category: "started", label: "Analysing", description: "Execution done; results are being analysed and written up.", transitions_to: ["complete", "abandoned"] },
6063
+ { id: "complete", status_category: "completed", label: "Complete", description: "Analysed and concluded. Findings captured.", transitions_to: [] },
6064
+ { id: "abandoned", status_category: "cancelled", label: "Abandoned", description: "Stopped before completion (killed, timed out, or superseded).", transitions_to: [] }
5892
6065
  ]
5893
6066
  };
5894
6067
  var TEMPLATE_LIFECYCLES = [
@@ -6050,18 +6223,21 @@ var FRAMEWORK_EXERCISE_LIFECYCLE = {
6050
6223
  phases: [
6051
6224
  {
6052
6225
  id: "draft",
6226
+ status_category: "started",
6053
6227
  label: "Draft",
6054
6228
  description: "The exercise has been created and entities pulled into scope, but the framework's inputs have not all been filled in yet.",
6055
6229
  transitions_to: ["active", "archived"]
6056
6230
  },
6057
6231
  {
6058
6232
  id: "active",
6233
+ status_category: "started",
6059
6234
  label: "Active",
6060
6235
  description: "The current, authoritative run of its framework. Its include edges carry the live results consumers read, rank, and render by.",
6061
6236
  transitions_to: ["archived"]
6062
6237
  },
6063
6238
  {
6064
6239
  id: "archived",
6240
+ status_category: "completed",
6065
6241
  label: "Archived",
6066
6242
  description: "A past run, retained for provenance. Still queryable but superseded by a newer exercise and hidden from default views. Can be revived to active.",
6067
6243
  transitions_to: ["active"]
@@ -6075,24 +6251,28 @@ var SPECIFICATION_LIFECYCLE = {
6075
6251
  phases: [
6076
6252
  {
6077
6253
  id: "draft",
6254
+ status_category: "started",
6078
6255
  label: "Draft",
6079
6256
  description: "Being authored. Not yet adopted as the canonical specification.",
6080
6257
  transitions_to: ["active", "superseded"]
6081
6258
  },
6082
6259
  {
6083
6260
  id: "active",
6261
+ status_category: "started",
6084
6262
  label: "Active",
6085
6263
  description: "In force. The current authoritative version products implement and conform to.",
6086
6264
  transitions_to: ["deprecated", "superseded"]
6087
6265
  },
6088
6266
  {
6089
6267
  id: "deprecated",
6268
+ status_category: "started",
6090
6269
  label: "Deprecated",
6091
6270
  description: "Still valid but no longer recommended; a successor exists or is imminent.",
6092
6271
  transitions_to: ["superseded"]
6093
6272
  },
6094
6273
  {
6095
6274
  id: "superseded",
6275
+ status_category: "completed",
6096
6276
  label: "Superseded",
6097
6277
  description: "Replaced by a newer specification. Retained for historical reference.",
6098
6278
  transitions_to: []
@@ -6104,9 +6284,9 @@ var PLANNING_CYCLE_LIFECYCLE = {
6104
6284
  initial_phase: "planned",
6105
6285
  terminal_phases: ["closed"],
6106
6286
  phases: [
6107
- { id: "planned", label: "Planned", description: "The cycle is being shaped: dates set, goal written, work scheduled into it. It has not started yet.", transitions_to: ["active"] },
6108
- { id: "active", label: "Active", description: "The team is inside the interval; work is flowing through it.", transitions_to: ["closed"] },
6109
- { id: "closed", label: "Closed", description: "The interval has ended. Scheduled work has shipped, carried over, or been dropped. May reopen if the team extends or reruns it.", transitions_to: ["active"] }
6287
+ { id: "planned", status_category: "unstarted", label: "Planned", description: "The cycle is being shaped: dates set, goal written, work scheduled into it. It has not started yet.", transitions_to: ["active"] },
6288
+ { id: "active", status_category: "started", label: "Active", description: "The team is inside the interval; work is flowing through it.", transitions_to: ["closed"] },
6289
+ { id: "closed", status_category: "completed", label: "Closed", description: "The interval has ended. Scheduled work has shipped, carried over, or been dropped. May reopen if the team extends or reruns it.", transitions_to: ["active"] }
6110
6290
  ]
6111
6291
  };
6112
6292
  var UPG_LIFECYCLES = [
@@ -29725,6 +29905,28 @@ function portfolioBody(doc) {
29725
29905
  ...doc.signals && doc.signals.length > 0 ? { signals: sortNodes(doc.signals).map(canonicalNode) } : {}
29726
29906
  };
29727
29907
  }
29908
+ function deriveSingleCounts(doc) {
29909
+ return { nodes: doc.nodes?.length ?? 0, edges: doc.edges?.length ?? 0 };
29910
+ }
29911
+ function derivePortfolioCounts(doc) {
29912
+ const members = doc.products ?? [];
29913
+ const memberKindOf = (p) => p.member_kind ?? "product";
29914
+ const watchedCount = members.filter((p) => memberKindOf(p) === "watched").length;
29915
+ const rollupCount = members.filter((p) => memberKindOf(p) === "org_rollup").length;
29916
+ const operatingFunctionCount = members.filter((p) => memberKindOf(p) === "operating_function").length;
29917
+ return {
29918
+ products: members.filter((p) => memberKindOf(p) === "product").length,
29919
+ ...watchedCount > 0 ? { watched_products: watchedCount } : {},
29920
+ ...rollupCount > 0 ? { org_rollups: rollupCount } : {},
29921
+ ...operatingFunctionCount > 0 ? { operating_functions: operatingFunctionCount } : {},
29922
+ product_areas: doc.product_areas?.length ?? 0,
29923
+ portfolios: doc.portfolios?.length ?? 0,
29924
+ cross_edges: doc.cross_edges?.length ?? 0
29925
+ };
29926
+ }
29927
+ function deriveCounts(doc) {
29928
+ return isPortfolio(doc) ? derivePortfolioCounts(doc) : deriveSingleCounts(doc);
29929
+ }
29728
29930
  function computeBodyChecksum(doc) {
29729
29931
  const body = isPortfolio(doc) ? portfolioBody(doc) : singleBody(doc);
29730
29932
  const content = JSON.stringify(body);
@@ -29764,7 +29966,7 @@ function serializeSingleWithHeader(doc, opts) {
29764
29966
  };
29765
29967
  const summary = deriveSummary(product.description);
29766
29968
  if (summary) header.summary = summary;
29767
- header.counts = { nodes: doc.nodes?.length ?? 0, edges: doc.edges?.length ?? 0 };
29969
+ header.counts = deriveSingleCounts(doc);
29768
29970
  if (doc.member_kind === "org_rollup" || doc.member_kind === "watched" || doc.member_kind === "operating_function") {
29769
29971
  header.member_kind = doc.member_kind;
29770
29972
  }
@@ -29787,20 +29989,7 @@ function serializePortfolioWithHeader(doc, opts) {
29787
29989
  };
29788
29990
  const summary = deriveSummary(org.description);
29789
29991
  if (summary) header.summary = summary;
29790
- const members = doc.products ?? [];
29791
- const memberKindOf = (p) => p.member_kind ?? "product";
29792
- const watchedCount = members.filter((p) => memberKindOf(p) === "watched").length;
29793
- const rollupCount = members.filter((p) => memberKindOf(p) === "org_rollup").length;
29794
- const operatingFunctionCount = members.filter((p) => memberKindOf(p) === "operating_function").length;
29795
- header.counts = {
29796
- products: members.filter((p) => memberKindOf(p) === "product").length,
29797
- ...watchedCount > 0 ? { watched_products: watchedCount } : {},
29798
- ...rollupCount > 0 ? { org_rollups: rollupCount } : {},
29799
- ...operatingFunctionCount > 0 ? { operating_functions: operatingFunctionCount } : {},
29800
- product_areas: doc.product_areas?.length ?? 0,
29801
- portfolios: doc.portfolios?.length ?? 0,
29802
- cross_edges: doc.cross_edges?.length ?? 0
29803
- };
29992
+ header.counts = derivePortfolioCounts(doc);
29804
29993
  header.provenance = buildProvenance(doc, opts);
29805
29994
  header.integrity = { algorithm: INTEGRITY_ALGORITHM, body: computeBodyChecksum(doc) };
29806
29995
  return JSON.stringify({ $upg: header, ...body }, null, 2) + "\n";
@@ -29868,9 +30057,61 @@ function isCanonical(text) {
29868
30057
  const parsed = parseUpg(text);
29869
30058
  return text === serializeCanonical(parsed);
29870
30059
  }
30060
+ function checkHeaderSeal(obj) {
30061
+ const raw = obj;
30062
+ const header = raw?.$upg;
30063
+ const report = {
30064
+ header_present: !!header,
30065
+ counts_checked: false,
30066
+ integrity_checked: false,
30067
+ counts_drift: [],
30068
+ integrity_drift: []
30069
+ };
30070
+ if (!header) return report;
30071
+ if (header.format_version !== UPG_CANONICAL_FORMAT_VERSION) {
30072
+ report.skipped_reason = `format_version "${header.format_version}" is not this serialiser's "${UPG_CANONICAL_FORMAT_VERSION}"; counts keys and body layout are format-version contracts, so neither seal can be judged here.`;
30073
+ return report;
30074
+ }
30075
+ const doc = normalizeDocument(raw);
30076
+ const declaredCounts = header.counts ?? {};
30077
+ const actualCounts = deriveCounts(doc);
30078
+ if (header.counts === void 0) {
30079
+ report.skipped_reason = "header has no `counts` block to compare.";
30080
+ } else {
30081
+ report.counts_checked = true;
30082
+ const fields = /* @__PURE__ */ new Set([...Object.keys(declaredCounts), ...Object.keys(actualCounts)]);
30083
+ for (const field of [...fields].sort()) {
30084
+ const declaredRaw = declaredCounts[field];
30085
+ const declared = typeof declaredRaw === "number" ? declaredRaw : 0;
30086
+ const actual = actualCounts[field] ?? 0;
30087
+ if (declared !== actual) report.counts_drift.push({ field, declared, actual });
30088
+ }
30089
+ }
30090
+ const integrity = header.integrity;
30091
+ if (!integrity || typeof integrity.body !== "string") {
30092
+ report.skipped_reason = report.skipped_reason ?? "header has no `integrity.body` seal to compare.";
30093
+ } else if (integrity.algorithm !== INTEGRITY_ALGORITHM) {
30094
+ report.skipped_reason = report.skipped_reason ?? `integrity.algorithm "${integrity.algorithm}" is not "${INTEGRITY_ALGORITHM}"; the declared digest cannot be recomputed here.`;
30095
+ } else {
30096
+ report.integrity_checked = true;
30097
+ const computed = computeBodyChecksum(doc);
30098
+ if (computed !== integrity.body) {
30099
+ report.integrity_drift.push({
30100
+ algorithm: integrity.algorithm,
30101
+ declared: integrity.body,
30102
+ computed
30103
+ });
30104
+ }
30105
+ }
30106
+ return report;
30107
+ }
30108
+ function checkHeaderSealText(text) {
30109
+ const noBom = text.charCodeAt(0) === 65279 ? text.slice(1) : text;
30110
+ return checkHeaderSeal(JSON.parse(noBom));
30111
+ }
29871
30112
 
29872
30113
  // src/index.ts
29873
- var UPG_VERSION = "0.25.1";
30114
+ var UPG_VERSION = "0.26.1";
29874
30115
  var UPG_FORMAT_VERSION = "0.4.0";
29875
30116
  var MARKDOWN_FORMAT_VERSION = "0.1";
29876
30117
  var UPG_TYPES = getTypes();
@@ -30039,6 +30280,8 @@ export {
30039
30280
  backfillSlug,
30040
30281
  buildTypeAliases,
30041
30282
  canBeChildOf,
30283
+ checkHeaderSeal,
30284
+ checkHeaderSealText,
30042
30285
  coerceProductStage,
30043
30286
  collectSlugsForType,
30044
30287
  compareVersions,
@@ -30047,6 +30290,9 @@ export {
30047
30290
  concernFor,
30048
30291
  concernGatesFor,
30049
30292
  crossProductScope,
30293
+ deriveCounts,
30294
+ derivePortfolioCounts,
30295
+ deriveSingleCounts,
30050
30296
  describeTreePattern,
30051
30297
  edgeCarriesProperties,
30052
30298
  evaluateAntiPatterns,